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)。可是事务一的第二次查询查到了事务二的修改结果。在数据库的读现象浅析中咱们介绍过,这种现象咱们称之为脏读。事务
原理get
SQL1在读数据时加行级共享锁,读完该行当即释放;it
SQL2在更新数据时加行级排他锁。只有在更新操做提交之后才容许其余操做,事务完成后释放table
现象class
SQL1进行两次读操做,在第一次读操做后,SQL2开始执行并对该数据加排他锁,SQL1只能等到SQL2执行完毕后执行第二次读操做。读已提交会致使两次读取的结果不一致,也就是不可重复读现象。test
事务1:select * from test where age between 10 and 21;
事务2:insert into test values(1,'newname',20);
原理
SQL1进行读操做时,对操做数据加行级共享锁,直到事务结束才释放;
更新操做添加行级排他锁,更新后释放。
现象
只有事务一结束,事务2才能够执行,因此能够解决不可重复读的问题;
如果SQL2是插入语句,因为事务1对数据加的是行级共享锁,没有对整表加锁,因此SQL2能够执行。这样两次SQL1的结果不一致,致使幻读。
原理
读写都加表级排他锁