在SQL标准中定义了四种隔离级别,每一种级别都规定了一个事务中所做的修改,哪些在事务内和事务间是可见的,哪些是不可见的。较低级别的隔离通常可以执行更高的并发,系统的开销也更低。

简单的介绍四种隔离级别:

1、READ UNCOMMITTED (未提交读)

  在 READ UNCOMMITTED 级别,事务中的修改,即使没有提交,对其他事务也都是可见的。事务可以读取未提交的数据,这也被称为脏读(Dirty Read)。这个级别会导致很多问题,从性能上来说,READ UNCOMMITTED 不会比其他的级别好太多,但却缺乏其他级别的很多好处,除非真的有非常必要的理由,在实际应用中一般很少使用。

2、READ COMMITTED (提交读)

  大多数数据库系统的默认级别都是 READ COMMITTED(但 MySQL 不是)。READ COMMITTED 满足前面提到的隔离性的简单定义:一个事务开始时,只能“看到”已经提交的事物所做的修改。换句话说,一个事务从开始知道提交之前,所作的任何修改对其他事务都是不可见的。这个级别有时候也叫做不可重复读nonrepeatable read),因为两次执行相同的查询,可能会得到不一样的结果。

3、REPEATABLE READ (可重复读)

  REPETABLE READ 解决了脏读的问题。该级别保证了在同一个事物中多次读取同样记录的结果是一致的。但是理论上,可重复读隔离级别还是无法解决另外一个幻读(Phantom Read) 的问题。所谓幻读,指的是当某个事务在读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围的记录时,会产生幻行(Phantom Row)。InnoDB 和 XtraDB 存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control) 解决了幻读的问题。可重复读是MySQL的默认事务隔离级别。

4、SERIALIZABLE (可串行化)

  SERIALIZABLE 是最高的隔离界别。它通过强制事务串行执行,避免了前面所说的幻读的问题。简单来说,SERIALIZABLE会再读取的每一行数据上都加锁,所有可能导致大量的超时锁争用的问题。实际应用中也很少用到这个隔离级别,只有在非常需要保证数据的一致性而且接受没有并发的情况下,才考虑采用该级别。

ANSI SQL 隔离级别

隔离级别 脏读可能性 不可重复读可能性 幻读可能性 加锁读
READ UNCOMMITTED Yes Yes Yes No
READ COMMITTED No Yes Yes No
REPEATABLE READ No No Yes No
SERIALIZABLE No No No Yes

最新文章

  1. 关于sigwait
  2. Events with Dojo(翻译)
  3. [转载]MongoDB开发学习 经典入门
  4. yii2解决百度编辑器umeditor图片上传问题
  5. 深入理解C语言
  6. android之短信拦截器
  7. POJ 2828 Buy Tickets(线段树 树状数组/单点更新)
  8. mssql全文索引
  9. SQL Server 创建表 添加主键 添加列常用SQL语句【转】
  10. xcode 开发ios兼容性问题的上下黑边 和 coco2d-x 游戏分辨率适配 ResolutionPolicy::FIXED_WIDTH 都会引起上下黑边问题!!!
  11. 带A圈的秘密
  12. 编译Android 4.4.2源码
  13. 原 js实现数据持久化
  14. max-width和width的区别
  15. MASS批量维护数据
  16. pb 11 数据窗口空白,预览pb崩溃解决方案
  17. redis问题与解决思路
  18. 负载均衡----实现配置篇(Nginx)
  19. 我们用整整三年时间,建成了一套软件:用户定制系统(UD)
  20. 转-ubuntu清理卸载wine的残余项目

热门文章

  1. PHP之递归函数
  2. [openjudge] 1455:An Easy Problem 贪心
  3. linux命令之grep,find
  4. ps色彩混合
  5. Spark系列视频
  6. JavaScript进阶 - 第10章 编程挑战
  7. Codeforces 1175E(倍增)
  8. SSM Spring SpringMVC Mybatis框架整合Java配置完整版
  9. layout_weight属性
  10. ios 利用kvc 监听可变数组变化