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

[经验分享] SQL Server 2008多版本并发控制

[复制链接]

尚未签到

发表于 2015-7-2 11:38:39 | 显示全部楼层 |阅读模式
  数据库的一致性,也是衡量DBMS性能的重要指标之一。目前大多数商业数据库(DB2, SQL Server)的并发控制采用的是两阶段锁(Two-Phase Locking,2PL)协议,2PL保证了并发事务执行的可串行化。但2PL在对任何数据进行读、写操作之前,需要对该数据加锁。在封锁相容矩阵中,S锁(Share Locks,共享锁)和X锁(Exclusive Locks,排它锁)是不相容的,因此当事务1正对数据A进行读操作(加S锁)时,事务2想要对数据进行写操作(加X锁),那么事务2必须等待事务1释放数据A上的S锁,才能继续执行。多版本并发控制(Multi-Version Concurrency Control,MVCC)较好地解决了这一问题。在多版本的系统中,每一次写数据均产生一个新的版本,读操作可以根据需要读取合适的版本,因此读写操作互不阻塞。MVCC虽然提高了并发度,但也带来了维护多个版本的存储开销。
  Microsoft SQL Server 数据库引擎引入了现有事务隔离级别的一种新的实现方式 - 已提交读,用于提供使用行版本控制的语句级快照。SQL Server 数据库引擎还引入了一个新的事务隔离级别 - 快照,用于提供也使用行版本控制的事务级快照。
  将 READ_COMMITTED_SNAPSHOT 数据库选项设置为 ON 可启用使用行版本控制的已提交读隔离。将 ALLOW_SNAPSHOT_ISOLATION 数据库选项设置为 ON 可启用快照隔离。为数据库启用任一选项时,数据库引擎都将保持被修改的每一行的版本。每当某个事务修改行时,修改前的该行图像将被复制到版本存储区的一页中。版本存储区是 tempdb 中的数据页集合。如果有多个事务修改行,则该行的多个版本将被链接到一个版本链中。使用行版本控制的读操作将检索每一行在事务或语句启动时已提交的最后一个版本。
  为 SQL Server 2008编写的或 SQL Server 中新增的应用程序,通过在 READ_COMMITTED_SNAPSHOT 数据库选项为 ON 时指定读提交的事务隔离级别,来实现使用行版本控制的读提交的隔离。所有读操作都将查看语句启动时已提交的行版本。这将提供数据的语句级快照。
  为 SQL Server 编写的应用程序将通过在 ALLOW_SNAPSHOT_ISOLATION 数据库选项为 ON 时指定快照事务隔离级别,来实现快照隔离。快照事务中的所有读操作都将查看事务启动时已提交的行版本。这将提供数据的事务级快照。
  对于使用基于行版本控制的隔离级别的事务,读操作不对数据请求共享锁。这意味着使用行版本控制的读取器不会妨碍其他读取器或编写器访问同一数据。同理,编写器也不会妨碍读取器。但是,编写器会互相妨碍(即使是在基于行版本控制的隔离级别下运行)。两个写操作不能同时修改同一数据。
  “快照隔离”功能扩展了 SQL Server 2008 中的锁定框架,它使应用程序能够在发生任何数据修改之前查看值。这可防止应用程序被锁定,同时仍将提供真正已提交的数据。SQL Server 2008 的 Read Committed Snapshot 需要数据库管理员来激活,允许数据被只读事务读取。所以 SI 对只读事务的并发控制效果是很好的,但是对更新事务是否也这样不得而知。对长时间运行的更新事务来说更为不利于与短期的高竞争性事务。如果跨数据库的事务试图使用 快照隔离(SI)标准 ,而不是所有数据库都设定的话,则该事务会失败。这无疑给可扩展性带来一定的障碍。看来微软要实现自己的比 SQL 92 规范还要强的 SI 还有很多路要走。
  参考资料:
  锁定和行版本控制: http://technet.microsoft.com/zh-cn/library/ms187101.aspx
  分析及解决SQLServer死锁问题:http://www.iyunv.com/liangqihui/archive/2007/11/26/972686.html
  Web开发必知的八种隔离级别: http://www.infoq.com/cn/articles/eight-isolation-levels

运维网声明 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-82500-1-1.html 上篇帖子: 在64位平台使用SQL Server Compact 下篇帖子: 如何获得数据库里有多少个全文索引。删除全文索引的方法 SQL server 2005
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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