mysql read commited 和 REPEATABLE read 原因

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql read commited 和 REPEATABLE read 原因相关的知识,希望对你有一定的参考价值。

read commited 和 REPEATABLE read  

关于一致性读的问题。 参考 mysql 技术内幕--innodb 存储引擎

session 1

mysql> begin;

Query OK, 0 rows affected (0.00 sec)

mysql> select * from t2;

+------+

| id   |

+------+

|    1 |

+------+

1 row in set (0.00 sec)

同时到session2:

mysql> 

mysql> 

mysql> begin;

Query OK, 0 rows affected (0.00 sec)

mysql> select * from t2;

+------+

| id   |

+------+

|    1 |

+------+

1 row in set (0.00 sec)

mysql> update t2 set id=2;

Query OK, 1 row affected (0.00 sec)

Rows matched: 1  Changed: 1  Warnings: 0

mysql> 

mysql> select * from t2;

+------+

| id   |

+------+

|    2 |

+------+

1 row in set (0.00 sec)

mysql> commit;

Query OK, 0 rows affected (0.01 sec)

再回到session1:

如果是

mysql>  select @@tx_isolation;

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

| @@tx_isolation |

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

| READ-COMMITTED |

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

1 row in set (0.00 sec)

mysql> select * from t2;

+------+

| id   |

+------+

|    2 |

+------+

1 row in set (0.00 sec)

在session1 的同一个事物中,两次查询t2,会看到不通的结果,

如果是:

mysql> select @@tx_isolation;

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

| @@tx_isolation  |

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

| REPEATABLE-READ |

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

1 row in set (0.00 sec)

在session 1 中,看到

mysql> begin;

Query OK, 0 rows affected (0.00 sec)

mysql> select * from t2;

+------+

| id   |

+------+

|    2 |

+------+

1 row in set (0.00 sec)

mysql> select * from t2;

+------+

| id   |

+------+

|    2 |

+------+

1 row in set (0.00 sec)

是同一个结果。 

这是由于mysql的一致性非锁定读 造成的。

如果读取的行正在备其他事物执行update或delete操作,这时读取操作不会因此去等待行上锁

的释放,innodb回去读一个快照数据。因为不需要等待访问的行上x锁的释放,所以称之为非锁定读。

快照数据是指该行 的之前版本的数据(可能有多个版本)。是通过undo断来实现的,undo是用

来在事物中回滚数据,因此快照数据没有额外开销。

在REPEATABLE read  下,快照读总是读取事物开始时的行版本数据;而在read commited下,

是读取最新一份快照,所以一个查询会看到不通的结果。


以上是关于mysql read commited 和 REPEATABLE read 原因的主要内容,如果未能解决你的问题,请参考以下文章

MySQL5.7 Read Committed事务隔离级别的研究-出现幻读

MySQL事务Read Committed隔离级别的数据可见性

MySQL专题 - 多版本并发控制 MVCC & read committed 隔离级别

mysql 5.6 read-committed隔离级别下并发插入唯一索引导致死锁一例

Read Committed

[Confluence] Your database must use ‘READ-COMMITED’ as default isolation level.