理解事务的隔离性

来源:未知 责任编辑:责任编辑 发表时间:2014-03-23 22:31 点击:
理解事务的隔离性
 
 事务是以可控的方式对数据资源进行访问的一组操作。其属性包括原子性、一致性、隔离性和持久性,也就是常说的ACID。其中,隔离性是针对数据资源的并发访问,规定了各个事务之间相互影响的程度。个人认为这是事务的4个特性里面,比较难理解的一个。
 
   事实上,事务的隔离性可以分为4种类型的隔离级别:Read Uncommitted,Read Committed, Repeatable Read和Serilization。这4个类型的隔离级别在应对数据资源并发访问可能出现的问题时的要求不一样。数据资源并发访问时可能出现的问题有:
  www.2cto.com  
  1.  脏读:如果一个事务A对数据进行了更改,但是还没有提交,而另一个事务B就可以读到事务A尚未提交的更新结果。这样,当事务A进行回滚时,那么事务B开始读到的数据就是一笔脏数据。
 
  2.  不可重复读:同一个事务在事务过程中,对同一个数据进行读取操作,读取到的结果不同。例如,事务B在事务A的更新操作前读到的数据,跟在事务A提交此更新操作后读到的数据,可能不同。
 
要避免不可重复读,需要将事务所操作的记录都加上锁,不允许其他事务对此记录进行写操作。
 
  3.    幻读:同样一个查询在整个事务中多次执行,查询所得的结果不同。例如,事务A对全部记录做了更新操作,尚未提交前,事务B又插入了一条记录,那么事务A再次读取数据库时,会发现还有一条记录(即事务B新插入的记录)没有做更新。
  www.2cto.com  
   也可以理解成:
 
要避免脏读,需要控制在事务没有提交更新前,其他事务无法看到此事务的更新结果。
要避免脏读,需要控制在事务没有提交更新前,其他事务无法看到此事务的更新结果。
要避免幻读,需要将整张表都锁住了。
 
    对于隔离级别:
Read Uncommitted:最低的隔离级别。一个事务可以读取另一个事务没有提交的更新结果。
Read Committed:一个事务的更新操作只有在提交了之后,才会被另一个事务读取到同一笔数据更新后的结果
Repeatable Read:在整个事务中,对同一笔数据的读取结果是相同的,不管其他事务是否同时在对这笔数据进行更新,也不管这笔更新是否提交。
Serilizable:所有的事务操作都必须串行操作。这种隔离级别最高,但是牺牲了系统的并发性。通常会使用其他的隔离级别加上相应的并发锁机制来控制对数据的访问。 
    事务的隔离级别与数据资源并发访问时的问题的对应关系可以如下表所示:  
 www.2cto.com  
脏读
 
不可重复读
 
幻读
 
Read Uncommited
 
可能
 
可能
 
可能
 
Read commited
 
不可能
 
可能
 
可能
 
Repeatable Read
 
不可能
 
不可能
 
可能
 
Serilization
 
不可能
 
不可能
 
不可能
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
用户名: 验证码:点击我更换图片
最新评论 更多>>

推荐热点

  • Request.ServerVariables 参数大全
  • 执行全文索引时出现权限不足的解决方法
  • 导入excel文件处理流程节点的解决方案
  • 查看sql修改痕迹(SQL Change Tracking on Table)
  • MongoDB安装为Windows服务方法与注意事项
  • App数据层设计及云存储使用指南
  • PostgreSQL启动过程中的那些事三:加载GUC参数
  • 写给MongoDB开发者的50条建议Tip1
  • Percolator与分布式事务思考(二)
网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
Copyright © 2008-2015 计算机技术学习交流网. 版权所有

豫ICP备11007008号-1