Chinaunix首页 | 论坛 | 博客
  • 博客访问: 108365
  • 博文数量: 13
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 195
  • 用 户 组: 普通用户
  • 注册时间: 2012-10-23 13:16
个人简介

数据库领域专心吃草

文章分类

全部博文(13)

文章存档

2015年(1)

2014年(4)

2013年(8)

我的朋友

分类: 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报重复主键的错误


由表格可以看到session1依然是能够“看到”session2插入的行数据,所以在使用repeatable read隔离级别进行开发的时候需要特别注意到这种情况。


serializable:序列化的事务处理,即事务是顺序处理的,可以解决上面提到的所有问题,但是为了提升数据库性能一般不会设置这种隔离级别。



阅读(3550) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~