转自
https://blog.csdn.net/sinat_36841379/article/details/75107985?locationNum=2&fps=1
我们都知道,事务调度一般有串行调度
和并行调度
,那首先来了解几个概念。
并发控制: 所谓并发控制,是指多用户共享的系统中,许多用户可能同时对同一数据进行操作。
调度: 指的是事务的执行次序。
串行调度: 多个事务依次串行执行,且只有当一个事务的所有操作都执行完后才执行另一个事务的所有操作。只要是串行调度,执行的结果都是正确的。
并行调度: 利用分时
的方法同时处理多个事务。但是并行调度的调度结果可能是错误的,可能产生不一致的状态,包括有:丢失修改,不可重复读和读脏数据。
串行调度和并行调度的区别:
其实比较明显的是虽然串行调度能够保证调度结果的正确性,但是却限制了系统并行性的发挥,不能有效利用资源,但是并行调度的调度结果又可能出现错误,而且可能不具有串行,正是因为这样,有一个具有串行调度效果的并行调度方法,而两段锁协议就是保证并行事务可串化的方法
。
两段锁协议: 是指所有的事务必须分两个阶段对数据项加锁和解锁。即事务分两个阶段
,第一个阶段是获得封锁
。事务可以获得任何数据项上的任何类型的锁,但是不能释放;第二阶段是释放封锁
,事务可以释放任何数据项上的任何类型的锁,但不能申请。
第一阶段是获得封锁的阶段,称为扩展阶段
:其实也就是该阶段可以进入加锁操作,在对任何数据进行读操作之前要申请获得S锁
,在进行写操作之前要申请并获得X锁
,加锁不成功,则事务进入等待状态
,直到加锁成功才继续执行。就是加锁后就不能解锁
了。
第二阶段是释放封锁的阶段,称为收缩阶段
:当事务释放一个封锁后,事务进入封锁阶段,在该阶段只能进行解锁而不能再进行加锁操作
。
这里举个例子说明:
事务T1遵守两段锁协议,其封锁序列是:
显然,上图中,T1事务部遵守两段锁协议。因为A获取共享锁后,接着又继续释放了共享锁,而正确的做法应该是Xlock C之后,unlock C之前。
可以证明,若并发执行的所有事务均遵守两段锁协议
,则对这些事务的任何并发调度策略都是可串行化
的。
最后,说一下什么是可串行化
:多个事务的并发执行是正确的,当且仅当其结果与某一次序串行地执行它们时的结果相同,称这种调度策略是可串行化调度。