数据库并发控制

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

描述事务处理概念的数据库模型 -------命名数据项的集合
数据项的粒度------数据项的大小
• 一条数据库记录 • 整个磁盘块 • 某个记录的字段(属性)值
数据库访问操作
• Read_item(X):将数据库项X读取到程序变量 • Write_item(X):将程序变量的值写入数据库项X中
两个事务的示例
规则
• 事务T在执行其仸何read_item(X)或write_item(X)操作之 前,必须先发出一个lock_item(X)操作 • 事务T中所有read_item(X)和write_item(X)操作执行完之 后,都必须发出一个unlock_item(X)操作
共享/排他(读/写)锁
• Read_lock(X) • Write_lock(X)
原因:这说明某个时间戳大亍T1的事物T2(比T1晚启劢),在 T1要写X之前,T2已经读或写了X的数据;
》如果是T2先写,则T1的写操作将覆盖了较晚启劢的T2的 写操作,即T2写操作无效 无效
》如果是T2先读,则T2读的是未经T1修改写入的数据,但 实际上较晚启劢的T2读的应该是T1修改后的数据。
1。
2。 3。
对R1加锁
请求对R2加 锁 等待
t1
t2 t3
4。
等待
等待
t4
请求对R1加 锁 等待
方法二.顺序加锁法
• 预先对数据项规定一个加锁排序,所以加锁操作都要按顺 序,释放锁时按照逆序
• 例子: 如果规定加锁顺序 先R1再R2, 则T2要对R2加锁之 前,需要先对R1 加锁,即T2需要 等待T1先释放R2 再释放R1
ELSE. 检验通过
检验通过,才能 提交和写回
• 在临时副本中修改的数据X提交成功,写回到数据库中, 使数据库中的X相应地改变。事务执行结束
That is all
请求对R1 加锁
等待
死锁的诊断
方法一.等待图法 数据库周期性地生成事务等待关系有向图, 若图中存在有向回路,则表明产生死锁,如:
方法二.超时法
• 若一个事务的等待时间超过了规定的时限,则系统认为 产生了死锁
• 缺点: 规定时限设置过短,则容易误判; 设置过长,则不能及时处理死锁。
破除死锁方法
某些事务必须回滚以破除死锁,一般选择回滚 带来代价最小的事务,释放该事务所持有的全 部锁,并撤销其对数据的修改操作。
规则
• 事务T在执行其仸何read_item(X)操作之前,必须先发出 read_lock(X)或write_lock(X)操作 • 事务T在执行其仸何write_item(X)操作之前,必须先发出 write_lock(X)操作 • 事务T中所有read_item(X)和write_item(X)操作执行完之 后,都必须发出unlock(X)操作
读、写
事务执行状态的状态转换图
开始事务
活动
结束事务
部分提交
撤 销
提交
部分提交
撤销
失败
终止
调度
n个事务T1,T2,…TN的调度S,是这些事 务的操作的一个执行顺序。来自不同事务的 操作可以在调度S中交替执行。但是,对亍参 与调度S的事务Ti,Ti出现在调度中S中的操 作,必须与它们在Ti中出现的顺序一致,也 就是说S中的操作必须是全序的。
• 每个数据库项 X 也有2个时间戳:读和写: read_TS(X) 《= TS(T最晚读),即T最晚读为成功读取X的最 晚的事务; write_TS(X) 《= TS(T最晚写),即T最晚写为成功写入X的最 晚的事务;
时间戳排序
• (1)写: • 当事物T1发出write_item(X)操作,需检查: a.若read_TS(X) > TS(T1), 或者write_TS(X) > TS(T1), 则拒绝 write操作,撤销并回滚T1,
解锁(释放):Unlock(X)
图共享/排他的加锁和解锁操作
共享/排他锁的实现
•包含四个字段的记录 <Data_item_name, LOCK, No_of_reads, locking_transaction> •变量LOCK关联亍数据库中的每个数据项X, 存放读锁定/写锁定/未锁定相应的编码 •Locking_transaction中存放持有锁的一个事务或列表 •No_of_reads中存放当前对该数据项进行读操作的事务数量 •队列存放等待访问该项的事务 •系统维护锁表,仅存放当前已加锁的数据项的相应记录
T1
read_item(X); X:=X-N; Write_item(X); Read_item(Y); Y:=Y-N; Write_item(Y)
T2
Read_item(X); X:=X+M; Write_item(X)
事务的特性
•原子性 •一致性 •隔离性 •持久性
事务状态和附加操作
• • • • • BEGIN_TRANSACTION READ或WRITE END_TRANSACTION COMMIT_TRANSACTION ROLLBACK(ABORT)
• 原因:说明在T1要读X之前,比T1晚启劢的T2已经修改了 X的数据,所以X已经不再是T1启劢时的数据值了。
对:
错:
X被T2修改
b. 若(a)中的条件没有发生,则执行T1的读操作, 并将read_TS(X)的值设置为TS(T1)和当前的read_TS(X) 中的最大值。 这是因为在T1读X前后,其他事务(如T2)都可以读X。
事务T1 1。 2。 3。 请求对R2加 锁 等待 4。 等待 对R1加锁
时间 t1 t2 t3
事务T2 对R2加锁
t4
请求对R1加 锁
等待
等待
时间戳方法
基亍时间戳排序的并发控制
时间戳概念
• 每个事物开始执行时,系统会给“他/她”分配一个时间 戳,通常是基亍系统时钟的。 • 越晚启劢的事务其时间戳数值越大。
事务
事务是数据库处理的一个逻辑工作单元, 它由用户定义的一个或多个访问数据库的 操作组成,这些操作一般一般包括检索 (读)、插入(写)、删除和修改数据。 一个事务内的所有语句被作为一个整体, 要么全部执行,要么全部不执行。 如果事务中的数据库操作仅涉及数据的检 索,而不更新数据库,那么这样的事务就 称为只读事务;否则,称为读写事务。
操作冲突的条件
• 属亍不同的事务 • 访问同一数据项 • 至少有一个操作是write_item(X)
并发控制的概念
数据库中的数据是可以共享的资源,因此会有很多 用户同时使用数据库中的数据。也就是说,在多用 户系统中,可能同时运行着多个事务,而事务的运 行需要时间,并且事务中的操作需要在一定的数据 上完成。当系统中同时有多个事务运行时,特别是 当这些事务使用同一段数据时,彼此之间就有可能 产生相互干扰。并发控制通过对并发操作进行正确 的调度保证事务的ACID特性。
乐观 的并发控制方法
• 提取和修改 • 检验 • 提交和写回
提取和修改
• 事务T将数据X从数据库中提取出来,保存在临时副本中 • 事务T对数据X所做的所有修改都保存在临时副本中
检验
• 事务执行完毕后,提交到数据库之前需要检验: IF. 数据X被在T从数据库中提取出之后,又被其 他事务提取且修改了,则冲突,T回滚,T的临时 副本被删除。
数据库并发控制技术
• 10:00,A订票点读出航班目前的机票余额数,设为10张 • 10:02,B订票点读出航班目前的机票余额数,也为10张 • 10:05,A订票点订出6张机票,修改机票余额为10-6=4, 并将4写回到数据库中 • 10:06,B订票点订出5张机票,修改机票余额为10-5=5, 并将5写回到数据库中
• 二进制锁 • 共享/排他锁(读/写锁)
二进制锁
一个二进制锁可以有两个状态或值:已加锁和未加锁(或简 化记为1和0)。每个数据项X都与一个不同的锁相关联。 •Lock_item(X) •unlock_item(X)
图二进制锁的加锁和解锁操作
二进制锁的实现
•二进制变量LOCK关联亍数据库中的每个数据项X •包含三个字段的记录 <Data_item_name, LOCK, locking_transaction> •队列存放等待访问该项的事务 •系统维护锁表,仅存放当前已加锁的数据项的相应记录
对:
错:
X未经T1修改
以上都违反了时间戳顺序。
• b.若以上(a)中的条件没有发生,则执行T1 的写操作,并将write_TS(X)的值设置为 TS(T1).
• (2)读: • 当事务T1发出read_item(X)操作,需检查: a.若write_TS(X) > TS(T1),则拒绝read操作,撤 销并回滚T1,
死锁
• 事务T1对数据R1封 锁之后,又要求对 数据R2封锁 • 而事务T2已经获得 对数据R2的封锁之 后,又要求对数据 R1封锁 • 这两个事务处亍互 相等待状态,发生 死锁
事务T1 1。 2。 3。 请求对R2 加锁 对R1加锁 时间 t1 t2 t3 对R2加锁 事务T2
等待
4。 等待 等待 t4
并发控制的必要性
• • • • 更新丢失 暂时更新(脏读) 错误求和 不可重复读
ቤተ መጻሕፍቲ ባይዱ
项X的值是错误的, 因为T1对它的更新 丢失了
事务T1因故障而必 须将X值 改变回其旧值,但 T2已经 读取了X的错误值
T3在X减去N之后读 X,而 在Y加N之前读Y; 因此产生了错误的 求和结果
并发控制的加锁技术
死锁的预防
• 方法一. 一次性封锁法 每个事务执行时,一次性对其要使用到的数据项 全部加锁,否则不能继续执行(缺一不可,只要有一 个锁不能加锁,则释放已经加好的锁,继续等待)
• 例子: 如果T1将R1和 R2一次性全部 加锁, 则T2要加锁时只 能等待直到T1 释放锁
事务T1 时间 事务T2 对R2加锁
相关文档
最新文档