设为首页 收藏本站
查看: 855|回复: 0

[经验分享] 锁和并发性----并发性的危险

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2014-7-18 09:57:31 | 显示全部楼层 |阅读模式
数据库并发性确保多个操作同时发生时,最终结果依然一致(agreement)。这种一致依靠一套规则和约束来协调事务的行为,从而确保不同的操作能够很好地在一起执行。如果忽略事务的隔离性,并发性会有如下危险:
丢失更新
当两个进程读取相同的数据并尝试用不同的值更新该数据时就会发生丢失更新。如下图,上半部分是Sessiion 1,下半部分是Session 2。我们首先执行Session1,紧接着执行Session 2。Session 1有延时8秒,因此Session 2先执行完 并显示结果为1100;Session 1之后执行完并显示结果为1005,而Session 2的更新丢失了。更新丢失的原因是两个事务都是从相同的值开始。
SouthEast.jpg
脏读
脏读是指读取未提交的数据,如果未提交的事务失败或因其他一些原因回滚了,那么脏读就会成为问题。如下图,Session 1执行更新后等待8秒再回滚,Session 2以同样的条件读取数据。先执行Session 1,紧接着执行Session2,这时Session 2就会执行脏读。
SouthEast.jpg
不可重复读
同一事务中两次读取数据,但每次得到的数据都不一样时,就会发生不可重复读。发生不可重复读是因为在较低隔离级别,读取数据仅仅为了读的持续而锁定数据,而不是为了事务的持续。如下图,Session 1在延时8秒后再次读取同样的数据,Session 2做更新动作。执行Session 1后紧接着执行Session 2,可以发现Session 1两次读取的结果不一样。如果把Session 1中的READ COMMITED换成REPEATABLE READ,再以同样的方式执行时,你会发现Session 1会阻止Session 2的执行,Session 1执行完后,Session 2才能执行。
SouthEast.jpg
虚读
当一个事务插入或删除一行,该行被另一个数据集读取时就会发生虚读。假设一个用户读取工作队列搜索新的工作项并获取到10行记录,另一个用户插入一项新工作,之后第一个用户刷新新工作项列表,现在有11行,那么这行额外的行就是一个虚行。如下图,执行Session 1后立即执行Session 2,可以发现Session 1的两个查询的结果集不一样。若要防止这种情况的发生,可以将隔离等级从READ COMMITTED变成SERIALIZABLE,并删除Session 2插入的数据,之后重新执行两个Session,可以发现Session 1的两个查询结果集是一样的,Session 2也会执行,只不过要等Session 1执行完成后。
SouthEast.jpg
SouthEast.jpg
双读(Double Reads)
使用默认的READ COMMITTED隔离级别扫描数据时会发生双读。在并发活动期间,一个查询可能要执行一定范围的表扫描,正在扫描时,第二个事务移动了一行,从而导致该行被读取两次。这会发生在范围扫描期间初始化读不是可重复的时候。数据一旦成功读取,上的锁就会默认释放。特定的动作需要阻止这个,你必须提升隔离级别。如下图,先执行Session 1的Part 1造成阻塞,然后执行Session 2(被阻塞),接着再执行Session 1的Part 2,Session执行完后,Session 2返回结果是6行,实际只有5行。更多关于双读的信息可以参考http://blogs.msdn.com/b/craigfr/archive/2007/04/25/read-committed-isolation-level.aspx
SouthEast.jpg
万圣节效应(Halloween Effect)
万圣节效应指的是结果集中数据移动位置并因此被改变多次。这个效应不同于双读,因为它是有数据修改驱动的,而不是读取查询。要执行一个更行,数据必须先被读取。执行这个要使用两个游标,一个用于读取,另一个用于写入。如果数据在所有的数据读入之前被写入游标更行,那么就有可能出现某行移动位置,并再次被读取,从而再次被更新。理论上,这会永远持续下去。使用索引读取数据,该索引的键值(key)会被查询更新,这是万圣节效应的一个例子。万圣节效应显然非常让人不悦,幸好SQL Server的存储引擎使其免受该效应。要确保可用于写入的数据全部被读取,SQL Server需要向计划注入一个阻塞操作符,如spool。更多关于如何防止万圣节效应的信息可以参阅http://blogs.msdn.com/b/craigfr/archive/2008/02/27/halloween-protection.aspx



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-22270-1-1.html 上篇帖子: 查询处理和执行----执行查询 下篇帖子: 锁和并发性----锁
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表