当前位置:文档之家› 第十章 并发控制

第十章 并发控制


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)
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
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解锁
17
• 如果要访问一个数据项,事务Ti必须首 先给该数据项加锁,如果该数据项已经 被另一事务加锁,则在所有不相容类型 锁释放之前,不会授予事务Ti锁。
18
Sql sever中锁的类型
共享锁 共享 (S) 锁允许并发事务读取 (SELECT) 一 个资源。
19
• 资源上存在共享 (S) 锁时,任何其它事 务都不能修改数据。一旦已经读取数据, 便立即释放资源上的共享 (S) 锁,除非 将事务隔离级别设臵为可重复读或更高 级别,或者在事务生存周期内用锁定提 示保留共享 (S) 锁。
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
20
排它锁 排它 (X) 锁用于数据修改操作,例如 INSERT、UPDATE 或 DELETE。确保 不会同时对同一资源进行多重更新。可 以防止并发事务对资源进行访问。其它 事务不能读取或修改排它 (X) 锁锁定的 数据。
21
封锁协议
• 对数据对象加锁时,需要约定一些规则,例如 何时申请X锁或S锁、持锁时间、何时释放等, 称这些规则为封锁协议(Locking Protocol) • 对封锁方式规定不同的规则,就形成了各种不 同的封锁协议 • 不同级别的封锁协议达到的系统一致性是不同 的 • 封锁协议只允许冲突可串行化调度。
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
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)
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秒
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
31
32
– 请分析该并发操作带来的数据不一致 问题属于哪一类?如果按照该顺序执 行,最终存款余额变成了多少? – 应采用几级封锁协议进行控制? – 具体应如何实现这两个事务的并发控 制?
33
一级封锁协议。 WHILE(x已建立排它锁) { 等待 } 对x建立排它锁 读x 更新x=x—3 释放排它锁 将乙事务修改为: WHILE(x已建立排它锁) { 等待 } 对x建立排它锁 读x 更新x=x—200 释放排它锁
三级封锁协议
一级封锁协议加上事务T在读取数据R之 前必须先对其加S锁,直到事务结束才释 放 三级封锁协议除防止了丢失修改和不读 “脏”数据外,还进一步防止了不可重复 读
28
29
不同级别的封锁协议
30
• 假设存款余额x=1000元,甲事务取走存 款300元,乙事务取走存款200元,其执 行时间如下:
– 共享锁。如果事务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
22
一级封锁协议(排他型)
• 事务T在修改数据R之前必须先对其加X 锁,直到事务结束(commit或rollback) 才释放 • 一级封锁协议可防止丢失修改,并保证 事务T是可恢复的 • 在一级封锁协议中,不能保证可重复读 和不读“脏”数据,因为只有读的时候 是不用加锁的。
23
• 任何更新Q的事务必须先执行lock_X(Q) 操作,以获得Q上的X锁,若未获准则事 务进入等待状态,直到获得X锁,事务才 继续进行。
3
• 当数据库中有多个事务并发执行时,系 统必须对并发事务之间的相互作用加以 控制,保证数据库的一致性,同时避免 用户得到不正确的数据。
4
• 所谓并发即多个事务轮流占用cpu时间 进行处理。
T1:read(A) A:=A-100 write(A); T2:read(A); temp:=A*0.1; A:=A-temp; write(A);
第十章 并发控制
1
并发控制
• 事务处理系统通常允许多个事务并发执 行。 • 事务在并发的情况下必须保证一致性。 • 考虑并发的原因:
– 一个事务由多个步骤组成,即事务中的语句 分为两类:I/O活动和CPU活动。 – 系统中可能运行着各种各样的事务。一些较 长一些较短。
2
• 单机系统:交叉并发执行 • 多处理系统:同时并发执行
• A跟B代表任意类型锁,若Ti对数据项Q加A类 型锁,而事务Tj当前在Q上有B型锁,若Ti可以 立即获得Q,则A和B相容。 • 一个数据项上可以同时拥有多个S锁,此后的 X锁必须等到所有共享锁释放。 • ___表示没加任何锁。
16
• 事务通过执行lock_S(Q)指令来申请Q上 的共享锁。 • 排他锁通过执行lock_ X(Q), • unlock(Q)指令来释放锁。
相关主题