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)
|