mysql数据库新建一个递增的_分享一个mysql实验—基于数据库事务隔离级别RR及RC的测试...
概述
今天主要分享一個最近做的實驗,主要是測試mysql數(shù)據(jù)庫在RR和RC不同事務(wù)隔離級別下的表現(xiàn)。
MySQL使用可重復(fù)讀來作為默認(rèn)隔離級別的主要原因是語句級的Binlog。RR能提供SQL語句的寫可串行化,保證了絕大部分情況(不安全語句除外)的DB/DR一致。
下面以mysql5.7版本(默認(rèn)binlog格式為row,事務(wù)隔離級別為RR)開始測試
1、binlog_format=row,事務(wù)隔離級別=RC
由以上測試知,RC隔離級別下,會話2執(zhí)行時序在會話1事務(wù)的語句之間,并且會話2的操作影響了會話1的結(jié)果,這會對Binlog結(jié)果造成影響。
由于Binlog中語句的順序以commit為序,兩會話的執(zhí)行時序是:
--實時查看指定binlog文件的內(nèi)容python binlog2sql.py -hxx.xx.xx -uroot -p 密碼 -d test --start-file='mysql-bin.000031' |grep test================================================================================================================DELETE FROM `test`.`t1` WHERE `c2`=2 AND `c1`=2 LIMIT 1; #start 283018 end 283245 time 2020-05-21 10:50:57UPDATE `test`.`t2` SET `c2`=3, `c1`=1 WHERE `c2`=1 AND `c1`=1 LIMIT 1; #start 283689 end 283944 time 2020-05-21 10:50:03UPDATE `test`.`t2` SET `c2`=3, `c1`=2 WHERE `c2`=2 AND `c1`=2 LIMIT 1; #start 283689 end 283944 time 2020-05-21 10:50:03UPDATE `test`.`t2` SET `c2`=4, `c1`=1 WHERE `c2`=3 AND `c1`=1 LIMIT 1; #start 283689 end 284044 time 2020-05-21 10:51:062、binlog_format=row,事務(wù)隔離級別=RR
在RR中,會話1語句update t2 set c2 = 3 where c1 in (select c1 from t1)會先在t1的記錄上S鎖(5.1的RC中不會上這個鎖,但5.0的RC會),接著在t2的滿足條件的記錄上X鎖。由于會話1沒提交,會話2的delete語句需要等待會話1的S鎖釋放,于是阻塞。
因此,在RR中,以上測試會話1、會話2的依次執(zhí)行,與Binlog的順序一致,從而保證DB/DR一致。
由于Binlog中語句的順序以commit為序,兩會話的執(zhí)行時序是:
--實時查看指定binlog文件的內(nèi)容python binlog2sql.py -hxx.xx -uroot -p xx -d test --start-file='mysql-bin.000031' |grep test================================================================================================================UPDATE `test`.`t2` SET `c2`=3, `c1`=1 WHERE `c2`=1 AND `c1`=1 LIMIT 1; #start 3986 end 4241 time 2020-05-21 11:09:30UPDATE `test`.`t2` SET `c2`=3, `c1`=2 WHERE `c2`=2 AND `c1`=2 LIMIT 1; #start 3986 end 4241 time 2020-05-21 11:09:30UPDATE `test`.`t2` SET `c2`=4, `c1`=1 WHERE `c2`=3 AND `c1`=1 LIMIT 1; #start 3986 end 4359 time 2020-05-21 11:10:22UPDATE `test`.`t2` SET `c2`=4, `c1`=2 WHERE `c2`=3 AND `c1`=2 LIMIT 1; #start 3986 end 4359 time 2020-05-21 11:10:22DELETE FROM `test`.`t1` WHERE `c2`=2 AND `c1`=2 LIMIT 1; #start 4390 end 4617 time 2020-05-21 11:10:12覺得有用的朋友多幫忙轉(zhuǎn)發(fā)哦!后面會分享更多devops和DBA方面的內(nèi)容,感興趣的朋友可以關(guān)注下~
總結(jié)
以上是生活随笔為你收集整理的mysql数据库新建一个递增的_分享一个mysql实验—基于数据库事务隔离级别RR及RC的测试...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux如何挂载硬盘(linux 如何
- 下一篇: 谷歌将首次在印度制造笔记本电脑,与惠普合