首页 > 编程知识 正文

事务的四个隔离等级(mysql默认隔离级别)

时间:2023-05-03 07:46:47 阅读:100610 作者:3008

1、事务的隔离级别

从低到高依次为未提交读取(未授权读取、未提交读取)、提交读取(授权读取、提交读取)、可重复读取(可重复读取)和可序列化(序列化)。这四个层次可以逐一解决脏读、不可重复读、不真实读的问题。

(1)未授权读取(未授权读取,未授权读取):

1)其他事务读取未提交的数据,导致脏读;

2)如果一个事务已经开始写数据,则不允许另一个事务同时写,但允许其他事务读这一行数据。这种隔离级别可以通过独占写锁定来实现。

3)避免更新丢失,但可能出现脏读。也就是说,事务B读取事务a的未提交数据。

(未提交读取:当一个事务写入数据时,只允许其他事务读取这一行数据,因此将发生脏读,事务T1读取T2的未提交数据)

(2)读取提交(授权读取,读取提交):

1)允许写入事务,因此会发生不可重复的读取。

2)读取数据的事务允许其他事务继续访问该行的数据,但未提交的写事务将禁止其他事务访问该行。

3)这种隔离级别避免了脏读,但可能会出现不可重复的读。交易A提前读取数据,交易B更新数据并提交交易,当交易A再次读取数据时,数据已经发生变化。

(Read committed:读取数据的事务允许其他事务操作,避免脏读,但会有不可重复的读取。事务T1读取数据,T2立即更新数据并提交数据。当事务T1再次读取数据时,它不同于第一次读取。即虚拟阅读)

(3)可重复读取:

1)禁止写交易;

2)读取数据的事务将禁止写入事务(但允许读取事务),写入事务将禁止任何其他事务。

3)避免不可重复的阅读和肮脏的阅读,但有时可能会出现幻影阅读。这可以通过“共享读锁”和“独占写锁”来实现。

(可重复读取:读取事务将禁止所有写入事务,但允许读取事务,避免不可重复读取和脏读取,但会出现幻影读取,即第一次查询中未出现的数据将包含在第二次查询中)

(4)可串行化(串行化):

1)禁止任何交易,逐一进行;

2)提供严格的事务隔离。它要求事务序列化,事务只能逐个执行,不能并发执行。如果仅通过“行级锁”无法实现事务序列化,则必须使用其他机制来确保刚刚执行查询操作的事务不会访问新插入的数据。

3)序列化是事务隔离的最高级别。同时成本最高,性能低,很少使用。在这个层次上,事务按顺序执行,既可以避免脏读、不可重复读,又可以避免幻影读。

00-1010当多个线程打开事务来操作数据库中的数据时,数据库系统应该能够执行隔离操作,以确保每个线程获得的数据的准确性。在介绍数据库提供的各种隔离级别之前,我们先来看看如果不考虑事务隔离会出现的几个问题:脏读、不可重复读和幻影读。

(1)肮脏的阅读

1.脏读定义:

1)语句1:表示在一个事务中读取另一个未提交事务中的数据,读取的数据不一致。

2)语句2:事务A添加、删除、修改数据,但未提交,另一个事务B可以读取未提交的数据。如果此时事务A回滚,则第二个事务B读取脏数据。

2.示例:

当一个事务多次修改某个数据,而这个事务中多次修改都没有提交,那么一个并发事务访问这个数据,就会导致两个事务得到的数据不一致。

比如用户A向用户B转账100元,对应的SQL命令如下

更新账户集money=money 100其中name=' B(甲此时通知乙)

更新账户集money=money - 100其中名称=' A

当只执行第一条SQL时,A通知B去查账,B发现钱已经实际到账(即此时已经发生了脏读),然后不管是否执行第二条SQL,只要交易没有提交,所有操作都会回滚,所以以后B再次查账时,会发现钱还没有实际转账。

(2)不能反复阅读。

1.不可重复的阅读定义:

1)语句1:表示对于数据库中的某些数据,一个事务范围内的多个查询返回不同的数据值,这是由于在查询间隔期间被另一个事务修改和提交。

2)语句2:一个事务a发生了两次读操作,在第一次读操作和第二次读操作之间,另一个事务B修改了数据,两个事务读取的数据不一致。

2.示例:

例如,事务T1正在读取某个数据,而事务T2会立即修改该数据并将该事务提交给数据库。事务T1再次读取数据并获得不同的结果,并发送不可重复的读取。

3.不可重复读取和脏读取的区别:

脏读是指一个事务读取另一个事务没有提交的脏数据,不可重复读取是指读取前一个事务提交的数据。

在某些情况下,不可重复读取不是问题。例如,如果我们多次查询一些数据,当然最终查询得到的结果是主要的。但是,在其他情况下,可能会出现问题。例如,对于相同的数据A和B,查询可能依次不同,A和B可能会打架.

(3)虚拟阅读(错觉阅读)

1.错觉阅读的定义:

1)语句1:是事务不独立执行时出现的现象。

>

2)说法2:第一个事务A对一定范围的数据进行批量修改,第二个事务B在这个范围增加一条数据,这时候第一个事务就会丢失对新增数据的修改。

2.举例:

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

3.幻读和不可重复读区别:

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

3、事务的四大特性

数据库中事务的四大特性(ACID):原子性、一致性、隔离性、持久性。如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性:

(1)原子性(Atomicity)

原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。

(2)一致性(Consistency)

一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。

如:拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。

(3)隔离性(Isolation)

隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。

即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。

(4)持久性(Durability)

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

例如:我们在使用JDBC操作数据库时,在提交事务方法后,提示用户事务操作完成,当我们程序执行完成直到看到提示后,就可以认定事务以及正确提交,即使这时候数据库出现了问题,也必须要将我们的事务完全执行完成,否则就会造成我们看到提示事务处理完毕,但是数据库因为故障而没有执行事务的重大错误。

4、总结:其实说来说去也就三方面的概念

1)四大隔离级别:串行化、可重复读、读已提交、读未提交;

2)四大特性(ACID):原子性、一致性、隔离性、持久性;

3)三个问题:脏读、不可重复度、幻读;

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。