第十章 并发控制

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

100
read(A) read(A)
Байду номын сангаас
t3 t4 t5
A=A-30 write(A)
70 read(A)
9
• 在t5时刻,读的是过了时的数据
t0 t1
T1 Read(A)=50 Read(B)=100 求和150
T2
t2 t3 t4 t5 t6 t7 t8 t9
Read(B)=100 B=B*2
Write(B)
并发控制的主要技术
• 封锁、时间戳、乐观控制法 • 确保并发控制正确即通过其他的方法保 证对数据项的访问以互斥的方式进行, 通过加锁完成。
14
封锁
• 所谓封锁就是事务T在对某个数据对象进行操 作之前,先向系统发出请求,对其加锁。此事 务对这个数据对象有一定控制, 而其他事务则 不能更新数据直到事务释放它的锁为止。 • 封锁类型主要有两种:
43
死锁的诊断与解除
• 超时法 – 事务的等待时间超过了规定的时限,就认为发 生了死锁 – 可能误判死锁 – 时限若设置得太长,死锁发生后不能及时发现 • 等待图法 – 并发控制子系统周期性地检测事务等待图,如 果发现图中存在回路,则表示系统中出现了死 锁
44
• 解除死锁的方法是选择一个处理死锁代 价最小的事务,将其撤消,释放此事务 持有的所有的锁,使其他事务得以继续 运行下去
38

3)死锁 增设table2(D,E) D E d1 e1 d2 e2 在第一个连接中执行以下语句 begin tran update table1 set A='aa' where B='b2' waitfor delay '00:00:30' update table2 set D='d5' where E='e1' commit tran 在第二个连接中执行以下语句 begin tran update table2 set D='d5' where E='e1' waitfor delay '00:00:10' update table1 set A='aa' where B='b2' commit tran 同时执行,系统会检测出死锁,并中止进程 39
25
• 在一级封锁协议中,如果仅仅是读数据 不对其修改,是不需要加锁的,所以不 能保证可重复读和不读“脏”数据
26
二级封锁协议
• 在一级封锁协议基础上加上事务T在读取 数据Q之前必须先对其加S锁,读完后即 释放S锁。 • 在二级封锁协议中,由于读完数据后即 可释放S锁,所以它不能保证可重复读
27
34
Sqlsever中的加锁
• 1 如何锁一个表的某一行
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED SELECT * FROM table ROWLOCK WHERE id = 1
35
• 2 锁定数据库的一个表 SELECT * FROM table WITH (HOLDLOCK) 加锁语句: sybase: update 表 set col1=col1 where 1=0 ; MSSQL: select col1 from 表 (tablockx) where 1=0 ; oracle: LOCK TABLE 表 IN EXCLUSIVE MODE ; 加锁后其它人不可操作,直到加锁用户解锁,用commit或 rollback解锁
7
数据库中A的值 100
更新事务T13
时 间 t0 t1 t2 t3 t4 t5 t6 t7
更新事务T1 更新事务T2 read(A)=16 read(A)=16 A=A-1 write(A) A=A-1 write(A) 均为15,假如飞机票 的话,则会出现售出 两张票,但显示只有 一张票
8
• 2、不可重复读,(读了过时的数据) 时 间 t0 t1 t2 更新事务T12 数据库中A的值 更新事务T14
17
• 如果要访问一个数据项,事务Ti必须首 先给该数据项加锁,如果该数据项已经 被另一事务加锁,则在所有不相容类型 锁释放之前,不会授予事务Ti锁。
18
Sql sever中锁的类型
共享锁 共享 (S) 锁允许并发事务读取 (SELECT) 一 个资源。
19
• 资源上存在共享 (S) 锁时,任何其它事 务都不能修改数据。一旦已经读取数据, 便立即释放资源上的共享 (S) 锁,除非 将事务隔离级别设臵为可重复读或更高 级别,或者在事务生存周期内用锁定提 示保留共享 (S) 锁。
• A跟B代表任意类型锁,若Ti对数据项Q加A类 型锁,而事务Tj当前在Q上有B型锁,若Ti可以 立即获得Q,则A和B相容。 • 一个数据项上可以同时拥有多个S锁,此后的 X锁必须等到所有共享锁释放。 • ___表示没加任何锁。
16
• 事务通过执行lock_S(Q)指令来申请Q上 的共享锁。 • 排他锁通过执行lock_ X(Q), • unlock(Q)指令来释放锁。
24
时间 更新事务T12
t0 t1 t2 t3 t4 t5 A=A-30 write(A) LOCK_X(A) read(A)
数据库中A的值
100
更新事务T13
LOCK_X(A) wait
t6
t7 t8 t9 t10 t11 t12 UNLOCK(A)
70
LOCK_X(A) read(A) A=A*2 write(A) 140 UNLOCK(A)
20
排它锁 排它 (X) 锁用于数据修改操作,例如 INSERT、UPDATE 或 DELETE。确保 不会同时对同一资源进行多重更新。可 以防止并发事务对资源进行访问。其它 事务不能读取或修改排它 (X) 锁锁定的 数据。
21
封锁协议
• 对数据对象加锁时,需要约定一些规则,例如 何时申请X锁或S锁、持锁时间、何时释放等, 称这些规则为封锁协议(Locking Protocol) • 对封锁方式规定不同的规则,就形成了各种不 同的封锁协议 • 不同级别的封锁协议达到的系统一致性是不同 的 • 封锁协议只允许冲突可串行化调度。
三级封锁协议
一级封锁协议加上事务T在读取数据R之 前必须先对其加S锁,直到事务结束才释 放 三级封锁协议除防止了丢失修改和不读 “脏”数据外,还进一步防止了不可重复 读
28
29
不同级别的封锁协议
30
• 假设存款余额x=1000元,甲事务取走存 款300元,乙事务取走存款200元,其执 行时间如下:
3
• 当数据库中有多个事务并发执行时,系 统必须对并发事务之间的相互作用加以 控制,保证数据库的一致性,同时避免 用户得到不正确的数据。
4
• 所谓并发即多个事务轮流占用cpu时间 进行处理。
T1:read(A) A:=A-100 write(A); T2:read(A); temp:=A*0.1; A:=A-temp; write(A);
31
32
– 请分析该并发操作带来的数据不一致 问题属于哪一类?如果按照该顺序执 行,最终存款余额变成了多少? – 应采用几级封锁协议进行控制? – 具体应如何实现这两个事务的并发控 制?
33
一级封锁协议。 WHILE(x已建立排它锁) { 等待 } 对x建立排它锁 读x 更新x=x—3 释放排它锁 将乙事务修改为: WHILE(x已建立排它锁) { 等待 } 对x建立排它锁 读x 更新x=x—200 释放排它锁
36
• 1)排它锁 新建两个连接 在第一个连接中执行以下语句 begin tran update table1 set A='aa' where B='b2' waitfor delay '00:00:30' --等待30秒 commit tran 在第二个连接中执行以下语句 begin tran select * from table1 where B='b2' commit tran 若同时执行上述两个语句,则select查询必须等待 update执行完毕才能执行即要等待30秒
第十章 并发控制
1
并发控制
• 事务处理系统通常允许多个事务并发执 行。 • 事务在并发的情况下必须保证一致性。 • 考虑并发的原因:
– 一个事务由多个步骤组成,即事务中的语句 分为两类:I/O活动和CPU活动。 – 系统中可能运行着各种各样的事务。一些较 长一些较短。
2
• 单机系统:交叉并发执行 • 多处理系统:同时并发执行
37
• 2)共享锁 在第一个连接中执行以下语句 begin tran select * from table1 holdlock -holdlock人为加锁 where B='b2' waitfor delay '00:00:30' --等待30秒 commit tran 在第二个连接中执行以下语句 begin tran select A,C from table1 where B='b2' update table1 set A='aa' where B='b2' commit tran 若同时执行上述两个语句,则第二个连接中的select查询可以执 行 而update必须等待第一个事务释放共享锁转为排它锁后才能执行 即要等待30秒
Read(A)=50 Read(B)=200
求和250 验算不对
10
• 3、读脏数据,事务T12修改A值为70以后还未提交
(commit),事务T15读取了A值,随后事务T12执行 回退,A的值恢复为100,则T15使用的是被撤销的A值。 时间 更新事务T12 数据库中A的值 读T15
t0 t1 t2 t3 t4 t5 t6
100
read(A) A=A-30
write(A)
70 read(A)
ROLLBACK
100
11
• 在数据库中,把未提交随后又被撤销的 数据称为“脏数据” • 解决以上问题的方法有两种:封锁技术 和时间戳技术。
12
• 设有两个事务T1、T2,其并发操作如下图所 示 ----------------------------------------------------T1 T2 -----------------------------------------------------读A=100 A=A*2写回 读A=200 ROLLBACK 恢复A=100 -----------------------------------------------------13
22
一级封锁协议(排他型)
• 事务T在修改数据R之前必须先对其加X 锁,直到事务结束(commit或rollback) 才释放 • 一级封锁协议可防止丢失修改,并保证 事务T是可恢复的 • 在一级封锁协议中,不能保证可重复读 和不读“脏”数据,因为只有读的时候 是不用加锁的。
23
• 任何更新Q的事务必须先执行lock_X(Q) 操作,以获得Q上的X锁,若未获准则事 务进入等待状态,直到获得X锁,事务才 继续进行。
read(B); B:=B+100; write(B)
read(B); B:=B+temp; write(B);
5
并发控制概述
6
• 数据库的并发操作带来的问题主要有以下三种: 1、丢失更新.事务T12和T13同时对A操作,T12对A值 减30,事务T13对A值加倍。 时 间 t0 t1 t2 t3 t4 t5 t6 t7 更新事务 T12 read(A) read(A) A=A-30 A=A*2 write(A) 70 200 write(A)
– 共享锁。如果事务Ti获得了数据项Q上的共享型锁, (记为S),则Ti可读取Q但不能写Q。其他事务只 能再对Q加S锁。 – 排他锁。若事务Ti对Q加排他锁(记为X),则Ti既 可以读Q又可以写Q,其他事务都不能再加任何类 型的锁,不能再读取和修改A
15
锁相容矩阵
S X __ S true false true X false false true __ true true true
活锁
40
• 当多个事务对同一数据封锁时,有一个 事务处于永远等待的状态,此时称为活 锁。 • 避免活锁的方法是采用先来先服务的方 法。
41
死锁
解决死锁主要有两种方法
– 采取一定措施来预防死 锁的发生
– 采用一定手段定期诊断
系统中有无死锁,若有 则解除之
42
死锁的预防
• 一次封锁法 – 要求每个事务必须一次将所有要使用的 数据全部加锁,否则就不能继续执行 • 顺序封锁法 – 预先将数据对象规定一个封锁顺序,所 有事务都按这个顺序实行封锁
相关文档
最新文档