MySQL 一致性读 深入研究(3)


效果等价于: start transaction 之后,马上执行一条 select 语句(此时会建立一致性读的snapshot)。

If the transaction is (the default level), all consistent reads within the same transaction read the snapshot established by the first such read in that transaction. You can get a fresher snapshot for your queries by committing the current transaction and after that issuing new queries. (RR隔离级别中的一致性读的snapshot是第一条select语句执行时建立的,其实应该是第一条任何语句执行时建立的)

我们在 mysqldump --single-transaction 中使用的就是该语句

SET session TRANSACTION isolation LEVEL REPEATABLE read START TRANSACTION /*!40100 WITH consistent snapshot */

所以事务开始时间点,分为两种情况:

1)START TRANSACTION 时,是第一条语句的执行时间点,就是事务开始的时间点,第一条select语句建立一致性读的snapshot;

2)START TRANSACTION  WITH consistent snapshot 时,则是立即建立本事务的一致性读snapshot,当然也开始事务了;

实验1:

session A

 

session B

 

mysql> set tx_isolation='repeatable-read';

 

mysql> set tx_isolation='repeatable-read';

 

 

 

mysql> select * from t1;

Empty set (0.01 sec)

 

mysql> start transaction;

 

 

 

 

 

mysql> insert into t1(c1,c2) values(1,1);

 

mysql> select * from t1;

+----+------+

| c1 | c2   |

+----+------+

|  1 |    1 |

+----+------+

1 row in set (0.00 sec)

 

 

 
实验2:

mysql> set tx_isolation='repeatable-read';

 

mysql> set tx_isolation='repeatable-read';

 

 

 

mysql> select * from t1;

Empty set (0.01 sec)

 

mysql> start transaction with consistent snapshot;

 

 

 

 

 

mysql> insert into t1(c1,c2) values(1,1);

 

mysql> select * from t1;

Empty set (0.00 sec)

 

 

 
上面两个实验很好的说明了 start transaction 和 start tansaction with consistent snapshot的区别。第一个实验说明,start transaction执行之后,事务并没有开始,所以insert发生在session A的事务开始之前,所以可以读到session B插入的值。第二个实验说明,start transaction with consistent snapshot已经开始了事务,所以insert语句发生在事务开始之后,所以读不到insert的数据。

3. Oracle中的一致性读

Oracle读一致性是指一个查询所获得的数据来自同一时间点

Oracle读一致性分为语句级读一致性事务级读一致性

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/a2a97a94eb22cea7cf85fd428f5bd1ba.html