并发控制技术
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一致事务的一个合法调度;但不是可串行化的
150
当事务 T1 执行对于数据项 B 的计算时,它的值已经被另一个事务 T2 改变,这与隔离性的基本原则即是冲突的。
T1
T2
A 25
B 25
l1 (A); r1 (A);
A:=A+100;
w1 (A); l1 (B); u1 (A);
l 2 (A); r2 (A);A:=A*2; w2 (A); l 2 (B)被拒绝
并发控制概述
事务管理器(TM)对于每一个 BEGIN TRANSCATION(可能是隐含地发出的)命 令都初始化一个事务,并赋予它一个事务标识符 i。其后的所有操作调用都由事务 管理器传递给调度器。 并发控制:调度器对于它从 TM 接收到的各事务动作,或者允许它们立即在数 据库上操作, 或者必须让它们处于等待状态, 直至调度器认为执行它是安全的时候。 问题:当连续向系统提出事务时,很难确定调度从什么时候开始,在何时结束。 假定:可串行性只相关于 S 的已提交事务投影 C(S) ,它仅包含 S 中已提交事 务的动作。如果任何时候 S 的已提交事务投影 C(S)都等价于某个串行调度,那么 我们可以从理论上承认 S 的可串行性,因为 DBMS 需要保证的仅仅是已提交事务的 可串行性。
所有的锁都必须在后面跟有一个对于相同元素的解锁。 (2) 事务的两阶段封锁:封锁必须在解锁之前。更明确地说,在任意一个两阶段封锁事务 Ti 中,任何 sli X 或 xli (X)动作 前不能有 u i (X)动作。 (3) 调度的合法性:一个元素或者可以被一个事务排他地封锁,或者可以被几个事务共享地封锁,但不能二者兼而有之。 更明确地说: (a) 如果 xli (X)出现在调度中,那么对某个 j≠i,后面不能再有 xl j X 或 sl j X ,除非中间插人了 u i (X)。 (b) 如果 sli X 出现在调度中,那么后面不能再有 xl j X ,除非中间插入了 u i (X)。 允许一个事务在同一个数据项上既申请并持有共享锁又申请并持有排他锁,只要它这样做不与其他事务的锁发生冲突。
考虑只存在排它锁的简单封锁模式
一个必须由所有事务遵循的基本规则是:
事务的(封锁)一致性,即动作和锁必须按预期的方式发生联系。它要求: (1) 事务只有已经在数据库元素上申请了锁并且还没有释放锁时才能读或写该数据库元素。 (2) 如果事务封锁某个数据库元素,它以后必须为该元素解锁。
必须由封锁调度器实施的基本约束是:
l1 (A); r1 (A);
A:=A+100;
w1 (A); u 1 (A);
l 2 (A); r2 (A);
A:=A*2; w2 (A); u2 (A);
125
250
l 2 (B); r2 (B);
B:=B*2;
w2 (B); u2 (B);
l1 (B); r1 (B);
B:=B+100;
50
w1 (B); u 1 (B);
事务的一致性条件可以表述为: “只要事务 Ti 有动作 ri X 或 wi X , 那么前面必然有一个动作 li X 且二者之间没有 ui X ,
ui X :事务 Ti 释放它在数据项 x 上的锁(解锁)。
li X :事务 Ti 请求数据项 X 上的锁。
125 250
r1 (B);B:=B+100; w1 (B); u1 (B);
l 2 (B); u2 (A); r2 (B);
B:=B*2;
125
w2 (B); u2 (B);
封锁调度器推迟将导致非法调度的请求.
250
可以通过下面两阶段封锁规则保证一致事务的合法调度是冲突可串行化的。
两阶段封锁(2PL) :在每一个事务中,所有封锁请求先于所有解锁请求。
多种并发控制机制 • 对数据库元素的访问按适当协议进行封锁,以阻止那些破坏可串行化原则的 操作行为。 • 时间戳排序,其中每一个事务被指定一个唯一的时间戳,协议确保按时间戳的顺序执行任何冲突操作。 • 多版本协议多数据项的多个版本进行维护。 • 有效性确认协议,是在事务中全部操作完成之后,在事务被允许提交之前检查可能的可串行性破坏。 事务系统层次
封锁机制
事务必须获得对它所要访问数据库元素的锁,以防止其他事务对于这些元素以不恰当方式进行几乎同时的访问,而导致可串 行化调度被破坏。
锁: 锁不过是对于数据库对象进行访问的某种合法性标记。当一个事务获得对于给定数据库对象的某种锁时,即是获得了对于 该数据库对象进行给定权限操作的合法性。有许多不同锁类型, 最基本的区分是只读锁与可读写锁: 只读锁: 也称之共享锁,可以由多个事务同时持有。 可读写锁: 也称之排他锁,在任何时候都只能由唯一的事务所持有。 封锁协议: 一个必须由所有事务共同遵守的规则集合。
服从 2PL 条件的事务被称为两阶段封锁事务,或 2PL 事务。
死锁问题
两阶段封锁一个末解决的问题是死锁的可能性,即调度器迫使几个事务永远地等待另一个事务持有的锁。
T1
T2
A 25
B 25
l1 (A); r1 (A);
l 2 (B); r2 (B);
A:=A+100; B:=B*2;
w1 (A); l1 (B)被拒绝
w2 (B); l 2 (A)ห้องสมุดไป่ตู้拒绝
125 50
使用多种锁的封锁系统 共享锁与排他锁
对任何数据项 X,其上或者可以有一个排他锁,或者没有排他锁而有任意数目的共享锁。
用 sli X 来表示“事务 Ti 申请数据项 X 上的一个共享锁” ,而用 xli (X)来表示“事务 Ti 申请数据项 X 上的一个排他锁” 。 继 续用 u i (X)表示 Ti 解锁 X;即它释放自己在 X 上持有的不管什么样的锁。对于事务的封锁一致性和 2PL 条件,以及调度的合法性, 在共享/排他封锁系统中可以分别地重新表述为: (1) 事务的封锁一致性:如果不是持有排他锁就不能写,且如果不持有任何锁就不能读。更明确地说,在任何事务 Ti 中: (a) 读动作 ri X 之前必须有 sli X 或 xli (X),且中间没有 u i (X)。 (b) 写动作 wi X 之前必须有 xli (X),且中间没有 u i (X)。
调度合法性:任何两个事务都不能封锁同一元素,除非其中一个事务已经先释放其锁。
扩展关于动作的记法,以加入封锁和解锁动作:
但后面将会有一个 ui X ” 。调度的合法性表述为: “如果调度中在动作 li X 后有 l j X ,那么这些动作之间的某个地方必然有 一个动作 ui X 。 仅有事务的封锁一致性和调度的合法性对于保证可串行化是不够的。 T1 T2 A 25 B 25
150
当事务 T1 执行对于数据项 B 的计算时,它的值已经被另一个事务 T2 改变,这与隔离性的基本原则即是冲突的。
T1
T2
A 25
B 25
l1 (A); r1 (A);
A:=A+100;
w1 (A); l1 (B); u1 (A);
l 2 (A); r2 (A);A:=A*2; w2 (A); l 2 (B)被拒绝
并发控制概述
事务管理器(TM)对于每一个 BEGIN TRANSCATION(可能是隐含地发出的)命 令都初始化一个事务,并赋予它一个事务标识符 i。其后的所有操作调用都由事务 管理器传递给调度器。 并发控制:调度器对于它从 TM 接收到的各事务动作,或者允许它们立即在数 据库上操作, 或者必须让它们处于等待状态, 直至调度器认为执行它是安全的时候。 问题:当连续向系统提出事务时,很难确定调度从什么时候开始,在何时结束。 假定:可串行性只相关于 S 的已提交事务投影 C(S) ,它仅包含 S 中已提交事 务的动作。如果任何时候 S 的已提交事务投影 C(S)都等价于某个串行调度,那么 我们可以从理论上承认 S 的可串行性,因为 DBMS 需要保证的仅仅是已提交事务的 可串行性。
所有的锁都必须在后面跟有一个对于相同元素的解锁。 (2) 事务的两阶段封锁:封锁必须在解锁之前。更明确地说,在任意一个两阶段封锁事务 Ti 中,任何 sli X 或 xli (X)动作 前不能有 u i (X)动作。 (3) 调度的合法性:一个元素或者可以被一个事务排他地封锁,或者可以被几个事务共享地封锁,但不能二者兼而有之。 更明确地说: (a) 如果 xli (X)出现在调度中,那么对某个 j≠i,后面不能再有 xl j X 或 sl j X ,除非中间插人了 u i (X)。 (b) 如果 sli X 出现在调度中,那么后面不能再有 xl j X ,除非中间插入了 u i (X)。 允许一个事务在同一个数据项上既申请并持有共享锁又申请并持有排他锁,只要它这样做不与其他事务的锁发生冲突。
考虑只存在排它锁的简单封锁模式
一个必须由所有事务遵循的基本规则是:
事务的(封锁)一致性,即动作和锁必须按预期的方式发生联系。它要求: (1) 事务只有已经在数据库元素上申请了锁并且还没有释放锁时才能读或写该数据库元素。 (2) 如果事务封锁某个数据库元素,它以后必须为该元素解锁。
必须由封锁调度器实施的基本约束是:
l1 (A); r1 (A);
A:=A+100;
w1 (A); u 1 (A);
l 2 (A); r2 (A);
A:=A*2; w2 (A); u2 (A);
125
250
l 2 (B); r2 (B);
B:=B*2;
w2 (B); u2 (B);
l1 (B); r1 (B);
B:=B+100;
50
w1 (B); u 1 (B);
事务的一致性条件可以表述为: “只要事务 Ti 有动作 ri X 或 wi X , 那么前面必然有一个动作 li X 且二者之间没有 ui X ,
ui X :事务 Ti 释放它在数据项 x 上的锁(解锁)。
li X :事务 Ti 请求数据项 X 上的锁。
125 250
r1 (B);B:=B+100; w1 (B); u1 (B);
l 2 (B); u2 (A); r2 (B);
B:=B*2;
125
w2 (B); u2 (B);
封锁调度器推迟将导致非法调度的请求.
250
可以通过下面两阶段封锁规则保证一致事务的合法调度是冲突可串行化的。
两阶段封锁(2PL) :在每一个事务中,所有封锁请求先于所有解锁请求。
多种并发控制机制 • 对数据库元素的访问按适当协议进行封锁,以阻止那些破坏可串行化原则的 操作行为。 • 时间戳排序,其中每一个事务被指定一个唯一的时间戳,协议确保按时间戳的顺序执行任何冲突操作。 • 多版本协议多数据项的多个版本进行维护。 • 有效性确认协议,是在事务中全部操作完成之后,在事务被允许提交之前检查可能的可串行性破坏。 事务系统层次
封锁机制
事务必须获得对它所要访问数据库元素的锁,以防止其他事务对于这些元素以不恰当方式进行几乎同时的访问,而导致可串 行化调度被破坏。
锁: 锁不过是对于数据库对象进行访问的某种合法性标记。当一个事务获得对于给定数据库对象的某种锁时,即是获得了对于 该数据库对象进行给定权限操作的合法性。有许多不同锁类型, 最基本的区分是只读锁与可读写锁: 只读锁: 也称之共享锁,可以由多个事务同时持有。 可读写锁: 也称之排他锁,在任何时候都只能由唯一的事务所持有。 封锁协议: 一个必须由所有事务共同遵守的规则集合。
服从 2PL 条件的事务被称为两阶段封锁事务,或 2PL 事务。
死锁问题
两阶段封锁一个末解决的问题是死锁的可能性,即调度器迫使几个事务永远地等待另一个事务持有的锁。
T1
T2
A 25
B 25
l1 (A); r1 (A);
l 2 (B); r2 (B);
A:=A+100; B:=B*2;
w1 (A); l1 (B)被拒绝
w2 (B); l 2 (A)ห้องสมุดไป่ตู้拒绝
125 50
使用多种锁的封锁系统 共享锁与排他锁
对任何数据项 X,其上或者可以有一个排他锁,或者没有排他锁而有任意数目的共享锁。
用 sli X 来表示“事务 Ti 申请数据项 X 上的一个共享锁” ,而用 xli (X)来表示“事务 Ti 申请数据项 X 上的一个排他锁” 。 继 续用 u i (X)表示 Ti 解锁 X;即它释放自己在 X 上持有的不管什么样的锁。对于事务的封锁一致性和 2PL 条件,以及调度的合法性, 在共享/排他封锁系统中可以分别地重新表述为: (1) 事务的封锁一致性:如果不是持有排他锁就不能写,且如果不持有任何锁就不能读。更明确地说,在任何事务 Ti 中: (a) 读动作 ri X 之前必须有 sli X 或 xli (X),且中间没有 u i (X)。 (b) 写动作 wi X 之前必须有 xli (X),且中间没有 u i (X)。
调度合法性:任何两个事务都不能封锁同一元素,除非其中一个事务已经先释放其锁。
扩展关于动作的记法,以加入封锁和解锁动作:
但后面将会有一个 ui X ” 。调度的合法性表述为: “如果调度中在动作 li X 后有 l j X ,那么这些动作之间的某个地方必然有 一个动作 ui X 。 仅有事务的封锁一致性和调度的合法性对于保证可串行化是不够的。 T1 T2 A 25 B 25