MySQL和SQL Server两种数据库在REPEATABLE-READ事务隔离级别实现方式不同,导致使用上也存在差异。
在MySQL中,默认使用REPEATABLE-READ事务隔离级别,MySQL通过MVCC (Multiversion Concurrency Control)来实现REPEATABLE-READ事务隔离级别。
在MS SQL SERVER中,默认使用READ-COMMITED事务隔离级别,SQL Server通过LOCK来实现REPEATABLE-READ事务隔离级别。
假设在可重复事务隔离级别下有下面步骤:
1. 事务TX1开始事务
2. 事务TX1访问表TB1
3. 事务TX2修改表TB2的数据并提交
4. 事务TX1访问TB2的数据
对于MySQL,事务TX1访问TB2得到的数据是TX2修改前的数据,因为MySQL的可重复读是按照事务开始的时间点来计算的,通过事务号来访问不同版本的数据。
对于SQL SERVER,事务TX1访问TB2得到的数据是TX2修改后的数据,因为SQL SERVER的可重复读是依赖于数据第一次被读取时加锁来保证的。
mysqldump --singletransaction方式就是基于REPEATABLE-READ事务隔离级别来获取整个备份期间的事务表的数据一致性,且无需对事务表加锁。