1.RR级别在MySQL里意味着在一个事务活跃期间,快照会一直打开,这可能会导致Undo/垃圾数据不能及时清理,Undo空间膨胀。没啥业务上必须的理由,尽量用RC
2.RR 隔离级别下,只有select 操作在整个事务期间使用一个 readview ,而dml 操作(insert update,delete)都是read commit(每个操作单独一个readview) 的;
######session 1; ###########session 2;
mysql Time1> begin;
mysql Time2>delete from a where id > 20000;
mysql Time3 > select * from a;
.........
| 20588 |
| 20589 |
| 20590 |
| 199991 |
| 999889 |
| 999988 |
| 999998 |
| 1999889 |
| 19998891 |
+----------+
20594 rows in set (0.03 sec)
mysql Time4> delete from a where id > 20000;
Query OK, 0 rows affected (0.00 sec) 没有数据删除;delete 是read commit 真实去看表上有多少条数据,session 2 已经删除了 (> 20000 )的计量
mysql Time5> delete from a where id > 19999;
Query OK, 1 row affected (0.01 sec) 这里删除一条数据,delete 是read commit 真实去看表上有多少条数据,session 2 已经删除了> 20000 ,所以这里他只能删除一条数据;
mysql Time6> select count(*) from a;
+----------+
| count(*) |
+----------+
| 20593 |自己事务里的操作是对自己可见的,直接剪掉affected rows 的计数 20594 -1=20593 ,select 操作不知道其他会话已经删除了 (id > 20000);
+----------+
1 row in set (0.01 sec)