MySQL中的可重复读(REPEATABLE READ)是事务隔离级别中最高的一级,它是通过将事务中所有的读操作,都使用一致性读快照来实现的。
可重复读级别的主要优点是可以防止出现幻读(Phantom Read)的问题,幻读是指在同一事务中,前一次查询的记录集和后一次查询的记录集不一致的情况。 而可重复读会在事务开启之初将所有涉及到的记录都做了锁定,这样在同一事务中就不会出现其他语句插入数据导致后面的查询出现幻读的问题了。
下面我们通过两个示例来说明可重复读级别可以解决幻读的问题:
示例一:
创建一个名为test的表,包含id字段和name字段,id是主键,插入以下数据:
INSERT INTO test (id, name) VALUES (1, 'Tom'), (2, 'Jack'), (3, 'Lucy');
启动一个事务,在其中查询test表中的name列的总和,再插入一条数据,最后再次查询name列的总和,观察结果:
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
START TRANSACTION;
SELECT SUM(name) FROM test;
INSERT INTO test (id, name) VALUES (4, 'Jerry');
SELECT SUM(name) FROM test;
COMMIT;
使用可重复读级别执行上述SQL语句时,第一次查询得到的总和是'TomJackLucy',第二次查询还是'TomJackLucy',并不会出现新插入的数据'Jerry'。所以,我们可以看出可重复读级别成功的避免了幻读问题。
示例二:
创建一个名为test2的表,包含id字段和name字段,id是主键,插入以下数据:
INSERT INTO test2 (id, name) VALUES (1, 'Tom'), (2, 'Jack'), (3, 'Lucy');
启动两个事务,第一个事务执行以下SQL语句:
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
START TRANSACTION;
SELECT SUM(name) FROM test2;
此时第二个事务在执行以下SQL语句:
INSERT INTO test2 (id, name) VALUES (4, 'Jerry');
我们可以看到第一个事务再次查询时,结果依然是Tom、Jack、Lucy三条数据的总和。可重复读级别避免了幻读问题,让第一个事务在执行的时候,不会受到其他事务的干扰。
综上所述,MySQL的可重复读级别能够解决幻读问题,通过在事务开启的时候锁定所有涉及到的记录,保证了事务中查询操作得到的数据是一致的。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:MySQL可重复读级别能够解决幻读吗 - Python技术站