数据库的四种隔离级别

一、read uncommitted:读未提交

SQL1:select * from test where id = 1
SQL2:update test set name='newname' where id = 1

原理数据库

操做一在进行数据库读操做时,不对数据库上任何锁;spa

操做二在进行更新操做时,对数据加行级共享锁。code

现象:blog

事务1 事务2
select * from test where id = 1

 

 
update test set name='newname' where id = 1
select * from test where id = 1
 
 
rollback

事务一共查询了两次,两次查询结果不同。在两次查询的过程当中,事务二对数据进行了修改,并未提交(commit)。可是事务一的第二次查询查到了事务二的修改结果。在数据库的读现象浅析中咱们介绍过,这种现象咱们称之为脏读事务

二、read committed(读已提交)

原理get

SQL1在读数据时加行级共享锁,读完该行当即释放;it

SQL2在更新数据时加行级排他锁。只有在更新操做提交之后才容许其余操做,事务完成后释放table

现象class

SQL1进行两次读操做,在第一次读操做后,SQL2开始执行并对该数据加排他锁,SQL1只能等到SQL2执行完毕后执行第二次读操做。读已提交会致使两次读取的结果不一致,也就是不可重复读现象。test

三、repeatable read(可重复读)

事务1:select  * from test where age  between 10 and 21;

事务2:insert into test values(1,'newname',20);

原理

SQL1进行读操做时,对操做数据加行级共享锁,直到事务结束才释放;

更新操做添加行级排他锁,更新后释放。

现象

只有事务一结束,事务2才能够执行,因此能够解决不可重复读的问题;

如果SQL2是插入语句,因为事务1对数据加的是行级共享锁,没有对整表加锁,因此SQL2能够执行。这样两次SQL1的结果不一致,致使幻读。

四、serializable(可序列化)

原理

读写都加表级排他锁

相关文章
相关标签/搜索