Contents
  1. 1. 基本概念
  2. 2. 可见性测试一( 针对 一致性非锁定读 )
  3. 3. 可见性测试二( 针对 一致性锁定读 )

基本概念

  • 什么是一致性非锁定读

    select,不加锁的读

  • 什么是一致性锁定读

    select xx for update , 加锁的读。
    读取的是最新的数据

  • 什么是幻影读

    同一个事务中,两次一致性锁定读得到的结果不一样,说明产生了幻影读

可见性测试一( 针对 一致性非锁定读 )

  • set global tx_isolation=’READ-COMMITTED’

事务一: begin; select * from lc

1
2
3
4
5
6
7
root:test> begin;select * from lc;
+------+
| id |
+------+
| 1 |
| 2 |
+------+

事务二:

1
2
3
4
5
6
7
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)

事务一:

1
2
3
4
5
6
7
8
9
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

1
2
3
4
5
6
7
root:test> begin;select * from lc for update;
+------+
| id |
+------+
| 1 |
| 2 |
+------+

事务二:

1
2
3
4
5
6
7
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)

事务一:

1
2
3
4
5
6
7
8
9
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

1
2
3
4
5
6
7
root:test> begin;select * from lc for update;
+------+
| id |
+------+
| 1 |
| 2 |
+------+

事务二:

1
2
3
root:test>begin; insert into lc values(3); --被事务一的for update锁住了

事务一:

1
2
3
4
5
6
7
8
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,且听下回分享

Contents
  1. 1. 基本概念
  2. 2. 可见性测试一( 针对 一致性非锁定读 )
  3. 3. 可见性测试二( 针对 一致性锁定读 )

幸福,不在于得到的多

而在于计较的少