频道栏目
首页 > 资讯 > SQL Server > 正文

事务并发控制可能出现问题和SQL下的解决策略讲解

18-06-11        来源:[db:作者]  
收藏   我要投稿

在这周的课程中我们学习了事务的并发控制所能解决的问题。

数据库作为一种面向所有授权用户的信息集合,不可避免地出现受到来自不同用户的调用和读写,而不同的时间进行调用和读写会对数据列产生不同的影响。所以数据库引入了不用锁的标准来减少这类问题。也就是隔离级别,不同的隔离级别的统称就是不同的封锁协议。

首先是一级封锁协议,在此协议中只使用排它锁(X lock)。一级协议是三级协议中最简单的一级,是最基础的封锁协议。甚至连脏读都没有办法解决。

然后就是二级协议,二级封锁协议是基于一级封锁协议上的完善,在此协议中仅使用共享锁,但对于释放条件有所改变,可以解决脏读的问题,但是从操作步骤上来说,没有办法解决幻读的问题。这就需要三级封锁协议

三级封锁协议基于二级封锁协议,对释放条件有所改变,从而解决了脏读和幻读的问题。但是没有办法解决对列添加所出现的问题。这时候就需要隔离级别:可序列化(四级封锁协议)来解决这个问题。

如果任务有一个队列,每一个任务都排队,直到完成才能进行下一个任务,这样的工作效率肯定是极其低下的,对于这种问题,可序列化可以解决,所以可序列化也被称作可串行化。

在隔离级别”可序列化“中,将自动在索引上获得范围锁,保护查询读取的行的范围(但不是查询条件所指定的范围),从而确保其它事务不会插入新数据,解决幻读(插入数据);由于封锁范围延伸至查询条件所指定的范围外最近的行,故在查询条件所指定的范围之外的插入亦可能被阻塞。

对于共享锁和排它锁还有一些补充说明,共享锁对于读取数据是允许的,也就是说允许多个用户对同一个数据进行读写,而一个用户在读取另一个用户如果在之后想要进行写入操作,就必须要等待其读写结束后执行,在SQL的操作界面上也有其对应的等待流程。但是排它锁的要求就相对严格,在一个用户读写的时候就禁止另外一个用户读写,如果有两个用户要求对一个表格中的列进行读写,则会发生死锁事件,双方都无法对该列进行读写,这时候SQL会根据请求时间,将其中一个用户作为死锁牺牲品,终止其读写要求,直到之前一个用户的读写要求完成后再开放读写权限。那么除了排它锁之外,有没有要求相对宽松的锁呢。有,更新锁。

更新锁基于排它锁之上条件相对宽松,在两个用户同时进行读写的时候,会阻止一个用户进行读写但不会阻塞共享锁,也就不会发生死锁现象。

相关TAG标签
上一篇:Oracle数据库的数据备份,本地,异地,exp-imp,expdp-impdp等实例讲解
下一篇:用两阶段提交协议、三阶段提交协议解决分布式事务一致性问题的操作学习
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站