ITEEDU

15.2.10 .7. 持续读如何在InnoDB中工作的例子

假设你正运行在默认的REPEATABLE READ隔离级别。当你发出一个持续读之时,即一个普通的SELECT语句,InnoDB按照你的查询看到的数据库,给你的事务一个时间点。如果另一个事务在你的时间点被指定之后删除一行并提交,你不会看见已被删除的行。插入和更新被相似地处理。

你可以通过提交你的事务来提前你的时间点,然后做另一个SELECT。

这被称为多版本并发控制(multi-versioned concurrency control)

               User A                 User B

 

           SET AUTOCOMMIT=0;      SET AUTOCOMMIT=0;

time

|          SELECT * FROM t;

|          empty set

|                                 INSERT INTO t VALUES (1, 2);

|

v          SELECT * FROM t;

           empty set

                                  COMMIT;

 

           SELECT * FROM t;

           empty set

 

           COMMIT;

 

           SELECT * FROM t;

           ---------------------

           |    1    |    2    |

           ---------------------

           1 row in set

在这个例子中,只有当用户B已经提交插入,并且用户A也已经提交之时,用户A可看见被用户B插入的行,因此时间点 是在用户B提交之前。

如果你想看数据库的最新状态,你应该用READ COMMITTED隔离级别或用一个锁定读:

SELECT * FROM t LOCK IN SHARE MODE;