在这周的课程中我们学习了事务的并发控制所能解决的问题。
作为一种面向所有授权用户的信息集合,不可避免地出现受到来自不同用户的调用和读写,而不同的时间进行调用和读写会对数据列产生不同的影响。所以数据库引入了不用锁的标准来减少这类问题。也就是隔离级别,不同的隔离级别的统称就是不同的封锁协议。
首先是一级封锁协议,在此协议中只使用排它锁(x lock)。一级协议是三级协议中最简单的一级,是最基础的封锁协议。甚至连脏读都没有办法解决。
然后就是二级协议,二级封锁协议是基于一级封锁协议上的完善,在此协议中仅使用共享锁,但对于释放条件有所改变,可以解决脏读的问题,但是从操作步骤上来说,没有办法解决幻读的问题。这就需要三级封锁协议
三级封锁协议基于二级封锁协议,对释放条件有所改变,从而解决了脏读和幻读的问题。但是没有办法解决对列添加所出现的问题。这时候就需要隔离级别:可序列化(四级封锁协议)来解决这个问题。
如果任务有一个队列,每一个任务都排队,直到完成才能进行下一个任务,这样的工作效率肯定是极其低下的,对于这种问题,可序列化可以解决,所以可序列化也被称作可串行化。
在隔离级别”可序列化“中,将自动在索引上获得范围锁,保护查询读取的行的范围(但不是查询条件所指定的范围),从而确保其它事务不会插入新数据,解决幻读(插入数据);由于封锁范围延伸至查询条件所指定的范围外最近的行,故在查询条件所指定的范围之外的插入亦可能被阻塞。
对于共享锁和排它锁还有一些补充说明,共享锁对于读取数据是允许的,也就是说允许多个用户对同一个数据进行读写,而一个用户在读取另一个用户如果在之后想要进行写入操作,就必须要等待其读写结束后执行,在sql的操作界面上也有其对应的等待流程。但是排它锁的要求就相对严格,在一个用户读写的时候就禁止另外一个用户读写,如果有两个用户要求对一个表格中的列进行读写,则会发生死锁事件,双方都无法对该列进行读写,这时候sql会根据请求时间,将其中一个用户作为死锁牺牲品,终止其读写要求,直到之前一个用户的读写要求完成后再开放读写权限。那么除了排它锁之外,有没有要求相对宽松的锁呢。有,更新锁。
更新锁基于排它锁之上条件相对宽松,在两个用户同时进行读写的时候,会阻止一个用户进行读写但不会阻塞共享锁,也就不会发生死锁现象。