首页 > 编程知识 正文

数据隔离级别(数据库隔离级别 详解)

时间:2023-05-04 01:28:37 阅读:92687 作者:847

数据库事务必须满足原子性、一致性、独立性和持久性的ACID特性。 对于隔离级别,SQL标准定义了四个隔离级别:读未提交、读已提交、可重复读取和可序列化。 隔离级别依次提高。 隔离级别越高,事务请求的锁定次数越多,或保留锁定的时间越长,并发性就越差。 因此,数据库的缺省级别通常不是最高级别的序列化。 Oracle数据库的缺省隔离级别为Read Committed,innodb的缺省级别为Repeatable Read。

Read Uncommitted

隔离级别最低,可以读取其他事务未提交的数据。 例如,事务a具有更新集b=2where a=1; 但是不提交。 事务处理b执行选择从水线a=1; 这时在事务b中读取的b是2。 此时,事务a将回滚,而b的实际值为1。 以前在事务所b看到的数据变成脏数据的就是脏领导。

脏领先的例子

Read Committed

能够读取其他事务提交的数据。 在这个水平上,脏的阅读是可以避免的,但反复阅读是不可避免的。 例如,包含列(a,b )的表t中有数据) 1,1 )。 事务处理a的执行:选择从仓库a=1; 读取b为1。 此时将执行事务处理b。 更新组b=2where a=1; 然后事务b提交。 此时,在事务处理a中再次选择来自网络的网络,其中a=1; 调查的数据b变成了2。 这是不能重复阅读的事情。 与脏读相比,不能重复阅读。 阅读的数据是已经提交的数据,是真实的数据。 脏读正在读脏数据。

不可重复的例子

Repeatable Read

可以重复阅读,避免重复阅读,但幻读是不可避免的。 幻读是什么? 请看例子。 在包含列(a,b )的表t中,有数据) 1,1 )。 执行事务处理a :从where a 0选择计数(* ); 此时,得到的结果为1。 事务处理b是插入内值(a,b ) 2,2 ); 事务b提交。 此时,在事务a中再次选择计数(* )来自where a 0; 当时,等待的结果变成了2。 这就是幻读。 与不可重复读取相比,幻读以范围为对象,不可重复读取以一个记录为对象。

幻读的例子

Serializable

是最高的事务隔离级别,成本最高,性能也很低,很少使用。 在这个级别上,事务按顺序执行,因此不仅可以避免脏读、不可重复读,还可以避免幻读。

对于innodb,默认值为Repeatable Read,但由于采用了next key锁定,因此在该级别上也可以避免幻读。 什么是next key锁定呢? gap锁加单行记录锁。 单行记录被锁定为单行记录。 gap锁定是区间锁定,锁定范围,但不包括记录本身。 下一个钥匙锁是这两种锁的结合体。

各隔离级别的整体情况如下

每个隔离级别的情况

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