一致性锁定读 vs 一致性非锁定读
基本概念
- 什么是一致性非锁定读
select,不加锁的读
- 什么是一致性锁定读
select xx for update , 加锁的读。
读取的是最新的数据
- 什么是幻影读
同一个事务中,两次一致性锁定读得到的结果不一样,说明产生了幻影读
可见性测试一( 针对 一致性非锁定读 )
- set global tx_isolation='READ-COMMITTED'
事务一: begin; select * from lc
root:test> begin;select * from lc;
+------+
| id |
+------+
| 1 |
| 2 |
+------+
事务二:
root:test>begin; insert into lc values(3);
Query OK, 1 row affected (0.00 sec)
root:test> commit ;
Query OK, 0 rows affected (0.00 sec)
事务一:
root:test> select * from lc;
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
+------+
3 rows in set (0.00 sec)
总结: RC模式,一致性非锁定读,是可以看见已经提交的事务的,所以RC模式是可提交读。
同理: RR模式,一致性非锁定读,是不可以看见已经提交的事务的,所以RR模式是可重复读。
可见性测试二( 针对 一致性锁定读 )
- set global tx_isolation='READ-COMMITTED'
事务一: begin; select * from lc
root:test> begin;select * from lc for update;
+------+
| id |
+------+
| 1 |
| 2 |
+------+
事务二:
root:test>begin; insert into lc values(3);
Query OK, 1 row affected (0.00 sec)
root:test> commit ;
Query OK, 0 rows affected (0.00 sec)
事务一:
root:test> select * from lc for update;
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
+------+
3 rows in set (0.00 sec)
- set global tx_isolation='REPEATABLE-READ'
事务一: begin; select * from lc
root:test> begin;select * from lc for update;
+------+
| id |
+------+
| 1 |
| 2 |
+------+
事务二:
root:test>begin; insert into lc values(3); --被事务一的for update锁住了
事务一:
root:test> select * from lc for update;
+------+
| id |
+------+
| 1 |
| 2 |
+------+
2 rows in set (7.48 sec)
总结: RC模式,同一个事务中,执行多次一致性锁定读,得到的结果不一样。所以RC模式存在幻影读的现象。
同理: RR模式,同一个事务中,执行多次一致性锁定读,得到的结果一样。 所以RR模式不存在幻影读的现象。
原理: 产生幻影读的原理,跟gap lock & next key lock 相关,如果想知道什么是gap lock & next key lock,且听下回分享