数据库中事务的四大特性和隔离级别

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/u013046597/article/details/76944480

从开始学习编程就学习的知识,可是发现并不是每一点都说的很清楚,呵呵哒,又从网上看了下,下面是自己整理的笔记:


数据库中事务的四大特性:


1.原子性:

事务包含的所有操作要么全部成功,要么全部失败

2.一致性

必须使数据库从一个一致性的状态转换到另一个一致性的状态。

如果事务执行前AB的钱一共是500元,那么AB相互转账,最后他们的钱加起来也要是500元。

3.隔离性

多个用户操作一张表时,数据库为每个用户开启的事务,不能被其他事务干扰,这几个事务要相互隔离。

扫描二维码关注公众号,回复: 3829819 查看本文章

4.持久性

一个事务一旦提交了,数据库中对数据的改变就是永久性的,即便在数据库系统遇到故障也不会丢失提交事务的操作。

 

数据库的几种问题:

1.脏读:

拿取钱的例子,A读到1000元钱,准备取走200元,这时B来读取,读到800,这时A事务回滚了,B读到的还是800,这就产生脏读。

2.不可重复读

对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,由于查询间隔,被另一个事务修改并提交了。

脏读是某一事务读取了另一个事务未提交的脏数据,而不可重复读则是读取了前一事务提交的数据。

3.虚读(幻读)

幻读是事务非独立执行时发生的一种现象。例如事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读。

幻读和不可重复读都是读取了另一条已经提交的事务(这点就脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)。

 

数据库的四种隔离级别:


  • 未提交读(Read uncommitted:在未提交读级别,事务中的修改,即使没有提交,对其他事务也都是可见的。事务可以读取未提交的数据,这也被称为脏读(Dirty Read。这个级别会导致很多问题,从性能上来说,未提交读不会比其他的级别好太多,但是缺乏其他级别的很多好处,在实际应用中一般很少使用。
  • 提交读(Read committed:大多数数据库系统的默认隔离级别都是提交读(但Mysql不是)。提交读满足前面提到的隔离性的简单定义:一个事务开始时,只能“看见”已经提交的事务所做的修改。换句话说,一个事务从开始直到提交之前,所做的任何修改对其他事务都是不可见的。这个级别有时候也叫做不可重复读(nonrepeatable read,因为两次执行同样的查询,可能会得到不一样的结果。
  • 可重复读(Repeatable read:可重复读解决了脏读的问题。该级别保证了在同一个事务中多次读取同样记录的结果是一致的。但是理论上,可重复读隔离级别还是无法解决另外一个幻读(Phantom read问题。所谓幻读,指的是当某个事务在读取某个范围内的记录时,另外一个事务中又在该范围插入了新的记录,当之前的事务再次读取该范围的记录时,会产生幻行(Phantom row。可重复读是MySQL的默认事务隔离级别。
  • 可串行化(Serializable:可串行化是最高的隔离级别。它通过强制事务串行执行,避免了前面所说的幻读问题。简单来说,可串行化会在读取的每一行数据上都加上锁,所以可能导致大量的超时和锁争用问题。实际应用中也很少用到这个隔离级别,只有在非常需要确保数据的一致性而且可以接受没有并发的情况下,才考虑用该级别。

写在后面:
    任何知识不断反复,不断反复,即使再简单~

猜你喜欢

转载自blog.csdn.net/u013046597/article/details/76944480