http://gimg2.baidu.com/image_search/src=http%3A%2F%2Fc-ssl.duitang.com%2Fuploads%2Fitem%2F202005%2F08%2F20200508102713_L8aCB.jpeg&refer=http%3A%2F%2Fc-ssl.duitang.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1649077062&t=40b7b14053ef546a57de4934b9442cbe",

SQL事务隔离级别

  事务的隔离性是指:在并发环境中,并发的事务是相互隔离的,一个事务的执行不能被其它事务干扰。也就是说,不同的事务并发操作相同的数据时,每个事务都有各自完整的数据空间,即一个事务内部的操作及使用的数据对其他并发事务是隔离的,并发执行的各个事务之间不能相互干扰。

  在标准的SQL规范中,定义了4种事务隔离级别,不同的隔离级别对事务的处理不同。包括:未授权读取、授权读取、可重复读取和串行化。

  • 未授权读取

概念:未授权读取也被称为读未提交。指一个事务能够读取到另一个事务中没有提交的更新数据。事务可以读取到其它事务未提交的数据,也被称为脏读。

说明:事务A和事务B在同时执行,事务A对某项数的值从1开始进行加1操作,直到加到10后提交,在此过程中,事务B查询该数据时,可以看到数据2、3......9的所有中间值,对这一系列中间值的读取就称之为脏读。

脏读:指一个线程中的事务读取到了另外一个线程中未提交的数据。

原因:

  • 授权读取

概念:授权读取也被称为读已提交。授权读取只允许获取已经被提交的数据。

说明:事务A和事务B在同时执行,事务A对某项数的值从1开始进行加1操作,直到加到10后提交。在事务A提交之前,事务B查询该数据为1;在事务A提交之后,事务B查询该数据为10。事务B无法看到数据2、3......9的所有中间值。授权读解决了未授权读产生的脏读问题。但若此时事务B还未结束,在事务C将该数值改为20后提交后,事务B去查询该数值将为30。对于这种在同一事务内多次读取同一数据但产生不同结果的情况称为不可重复读。授权读取允许不可重复读。

不可重复读:指一个线程中的事务读取到了另外一个线程中提交的update的数据。

原因:

  • 可重复读取

概念:保证在同一事务处理过程中,多次读取统一数据时,其数值和开始时刻是一致的。该事务级别禁止了脏读取和不可重复读取,但是有可能出现幻影数据(即幻读)。

说明:

幻读:指一个线程中的事务读取到了另外一个线程中提交的insert的数据。所谓幻读,是指事务A读取与搜索条件相匹配的若干行。事务B以插入或删除行等方式来修改事务A的结果集,然后再提交。 此时事务A再次查询数据会发现表中还有没有修改的数据行,就好象发生了幻觉一样。

解决方案:一般解决幻读的方法是增加范围锁RangeS,锁定检锁范围为只读,这样就避免了幻读。

  • 串行化

概念:是最严格的事务隔离级别。它要求所有事务都被串行执行,即在读取的每一行数据上都加上了锁,使读写相互都会阻塞,不允许事务并发执行。隔离级别最高,是最安全,不会出现脏读、不可重复读、幻读,和丢失更新。但性能最低。

  • 隔离级别示意图:

 

posted @ 2024-04-18 20:14  DeepInThought  阅读(28)  评论(0编辑  收藏  举报