分类: Mysql/postgreSQL
2013-12-16 18:10:42
Mysql有四种隔离级别:read uncommited,read commited,repeatable read,serializable。这四种隔离级别分别解决了一些特定的问题
read uncommited: 可以读取未提交的事务数据,也就是读取了“脏数据”,产生了数据库领域的术语“脏读”。
read commited:只能读取已经提交的事务数据,但是如果A事务读取了某一行数据,A事务未提交,B事务修改了这一行数据然后提交,这时候A事务再去
读取该行数据那么就会发现两次读取的同一行的数据发生了变化,这就是“不可重复读”。
repeatable read:可重复读,即事务A不论多少次读取同一行数据,该行数据都不会发生变化,但是如果事务A读取某一个范围内的数据,事务A未提交,事务B在该范围内插入一行数据或者删除一行数据,这时候事务A再去读该范围内的数据发现数据量有变化,这就是“幻读”。不可重复读和幻读很相似,但是在数据控制方面有很大的不同,解决不可重复读的方法是锁定事务A涉及的所有行,解决幻读的方法是锁定事务A涉及的所有行及其边界。但是mysql的repeatable read级别是很神奇的,mysql通过间隙锁解决了幻读问题,但是并不是彻底的解决,只是解决了读的问题,其他的DDL操作可能会受到影响,如下面的例子:
session1 | session2 |
session1查询数据 |
|
|
session2 插入数据然后提交,可以看到session1并没有锁住(6,无穷大)的间隙,由于测试 的时候进行了误操作,所以ID向前多加了一,但是并不影响测试。 |
session1进行查询,发现并没有发生幻读的现象 |
|
session1尝试插入一条数据,该数据的主键为7,即跟session2插入的行的主键相同,这时会发现mysql报重复主键的错误 |
|