Sybase数据库基础知识
本章概述
本章的目标是定义和描述在SQL Server 的事务管理,以维护数据的一致性。
通过本章的学习你应能: ❖ 定义事务并标识当一个事务成功或失败 时将会发生什么 ❖ 描述事务的隔离级别 ❖ 使用T-SQL命令定义事务及处理错误
本章要点
❖ 事务和数据一致性约束 ❖ SQL Server的封锁机制 ❖ 事务的隔离级别 ❖ 死锁及其解除 ❖ 事务控制语句 ❖ 事务模式 ❖ 建立schema ❖ 事务中的出错处理
t1 t2
t3
用户B
x=40 x=x-20
分别把x减少30和20
t4
t
丢失修改
用户A
x=40 x=x-30
t1 t2
t3
t4
t
用户B
x=40 x=x-20
用户A在t3把改后的x(x=10)写入数据库
丢失修改
用户A
x=40 x=x-30
t1 t2
t3
t4
t
用户B
x=40 x=x-20
随后,用户B在t4把改后的x(x=20)写入数据库。对用 户A而言,他的修改在t4处丢失了。
11.1.2 数据一致性约束问题
多用户并发存取同一数据将会导致的 数据不一致性问题:
1. 丢失修改 2. 读出“脏”(dirty)数据 3. 不能重复读(non-repeatable)
丢失修改
用户A x=40
t1 t2
t3
用户B
x=40
用户A和B都读取x(x=40)
t4
t
丢失修改
用户A
x=40 x=x-30
t
用户B
x=70
用户A在t4时撒消(Undo)了对x的修改,数据库中 仍维持x=40。但用户B已把“脏”数据(x=70)取走 。
不能重复读
用户A 用户B
x=40 t1 t2 t3
t4 t5
t6 t
x=40
用户A、用户B分别读取x=40
不能重复读
用户A 用户B
x=40 t1 t2
y=30
x+y=70 t3 t4 t5
t6 t
x=40
在t3用户A取出y=30,并计算x+y=70。
不能重复读
用户A 用户B
x=40 t1 t2
y=30
x+y=70 t3 t4 t5
t6 t
x=40
x=x+20
在t4时用户B把x增加20,并于t5把x(x=60)写入数据 库。
不能重复读
用户A 用户B
x=40 t1 t2
y=30
x+y=70 t3 t4 t5
❖ 事务日志(Transaction Log)—使事务具有 可恢复性。
11.2 SQL Server的封锁机制
封锁:一个事务可向系统提出请求向对被 操作的数据加锁(lock)。其他事务必须等到此 事务解锁(unlock)之后,才能访问该数据。
11.2.1 锁的类型
SQL Server支持三种基本的锁类型: 共享(S)锁 排它(X)锁 更新(U)锁。
rollback 表示要撒消(undo)该事务已做 的一切操作,回滚到事务开始的状态 。
commit 表示提交事务中的一切操作,使 得对数据库的改变生效.
事务的管理
❖ 事务控制语句—它使程序员能指把一系列操 作(T-SQL命令)作为一个工作单位来处理。
❖ 封锁机制(locking)—封锁正被一个事务修 改的数据,防止其他用户访问到“不一致” 的数据。
11.1 事务和数据一致性约束
11.1.1 事务(Transaction)
事务: 是并发控制的基本单位,它是一 个操作 序列,这些操作要么都做,要么都不做, 它是一个不可分割的工作单位。
(例如:银行转帐系统) 事务是数据库维护数据一致性的单位,它 将数据库从旧的一致状态转变为新的一致性状 态。在每个事务结束时,都能保持数据一致性 约束。
1. 共享(S)锁 ❖ 多个事务可封锁一个共享页。 ❖ 任何事务都不能修改该页。 ❖ 通常是该页被读取完毕,S锁立即被释放。
2. 排它(X)锁 ❖ 仅允许一个事务封锁此页。 ❖ 其他任何事务必须等到X锁被释放才
能对该页进行访问。 ❖ X锁一直到事务结束才能被释放。
3. 更新(U)锁 ❖ 用来预定要对此页施加X锁,它允许其他 事务读,但不允许再施加U锁或X锁。 ❖ 当被读取的页将要被更新时,则升级为X锁。 ❖ U锁一直到事务结束时才能被释放。
获得锁 S
其他进程 查询? yes
可以 修改? no
delete titles where price>25
X
no
no
insert titles values(…)
X
no
no
update titles set type=”general” U
yes
no
where type=”business”
然后X
11.2.2 三种锁的相容性
❖ 读操作(selete)获得共享锁; ❖ 写操作(insert,delete)获得排它锁; ❖ 更新操作(update)可分解为一个有更新意 图的读和一个写操作,故先获得更新锁,然 后再升级为排它锁。
封锁实例
执行的T-SQL命令 Select title_i100 t6 t
x=40
x=x+20
在t6时,用户A取出Z并继续计算x+y+z=100。
不能重复读
用户A 用户B
x=40 t1 t2
y=30
x+y=70 t3 t4 t5
z=30
未核算 x+y+z=100 t6 t
x=40
x=x+20
未核算时,x+y+z=100
不能重复读
用户A
no
no
11.3 事务的隔离级别
11.3.1 ANSI隔离(Isolation)级别
ANSI标准为SQL事务定义了四个隔离级别,隔 离 级别越高,出现数据不一致性的可能性就越小(并发 度也就越低)。较高的级别中包含了较低级别中所规 定了的限制。
读出“脏”数据
用户A
x=40 x=x+30
t1 t2
t3
t4
t
用户B 用户A在t2把x增加30(尚未写入数据库)
读出“脏”数据
用户A
x=40 x=x+30
t1 t2
t3
t4
t
用户B
x=70
用户B在t3由数据缓存读出x=70
读出“脏”数据
用户A
x=40 x=x+30
t1 t2
t3
撤销(x=40) t4
x=40 t1 t2
y=30
x+y=70 t3 t4 t5
核算 x+y+z=100 z=30
未核算 x+y+z=100 t6 t
用户B
x=40
x=x+20
但如果用户A为进行核算而把x、y、z重读一次再进 行计算,却出现x+y+z=120!(x已增加20)。
11.1.3 标识一个事务
在SQL Server中,通常事务是指以begin transaction开始,到rollback 或一个相匹配 的commit 之间的所有语句序列.