MySQL的事务隔离级别分为4个:读未提交、读已提交、可重复读和串行化。在可重复读隔离级别下,MySQL如何保证数据的一致性,下面进行介绍。
可重复读隔离级别下,MySQL保证数据的一致性的关键是使用了多版本并发控制(MVCC)的技术。MVCC的核心思想是:每次修改数据的时候,不直接修改原始数据,而是将修改后的数据作为新版本存储起来。
在可重复读隔离级别下,每个事务都有自己的读视图,这个读视图是一个时间点的数据快照。读视图中包含了事务开启时已经存在的数据版本。当一个事务需要读取数据的时候,会使用自己的读视图来获取数据。在事务执行期间,它只能看到已经存在于读视图中的数据版本。
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
START TRANSACTION;
SELECT * FROM table WHERE name='John' FOR UPDATE;
UPDATE table SET age=age+1 WHERE name='John';
COMMIT;
以上是一个可重复读的事务,其中,先从table表中选取name为'John'的数据行并对该数据行加上行级锁,这样保证了其他事务无法更新该数据行;更新该数据行的age字段,然后提交事务。
总之,可重复读隔离级别下,MySQL使用MVCC技术保证数据的一致性。在事务执行期间,事务只能看到已经存在于自己读视图中的数据版本,保证了事务的隔离性;每个事务都有自己的读视图,这样每个事务读取的数据都是自己的数据,而不会影响其他的事务,从而保证了可重复读的特性。