数据库的并发控制(事务)
管理事务
事务的4种运行模式:
显式事务 | 每个事务均以begin trasaction 语句显示开始,以commit或rollback语句显示结束 |
---|---|
隐式事务 | 在前一个事务完成时新事务隐式启动,但每个事务仍以commit或rollback语句显示完成 |
自动提交事务 | 每条语句都是一个事务 |
批处理级事务 |
(1)启动和结束事务
(2)事务保存点
保存点设置语句格式:save transaction 保存点名 或保存点变量
保存点使用语句格式:rollback transaction 保存点名 或保存点变量
(3)自动提交事务
(4)事务的嵌套
eg: (1)Alice和Bob分别有银行账号A、B,分别用表a、表b表示,这2个表都只有1个字段amount,表示余额。现在需要从Alice向Bob转账制定金额,要求转账过程中不能出现错误,而且不管转账是否成功,都扣除Alice账号1元钱的手续费。
(2)amount字段上的约束条件是余额不能小于0
declare @xmoney money,@err1 int,@err2 int
set @xmoney = 300 --指定转账金额为300
begin transaction
update A
set amount = amount - 1 --扣除手续费
set @err1 = @err1 + @@ERROR --记录上述update可能出现的错误
save transaction transfer --设置保存点transfer
update A
set amount = amount - @xmoney --从账号A中扣除金额
set @err2 = @err2 + @@ERROR --记录上述update可能出错的情况
update B
set amount = amount + @xmoney --想账号B中转入金额
set @err2 = @err2 +@@error
if @err1 != 0 --如果扣除手续费出现错误
begin
rollback transaction
print '所有操作失败'
end
else begin
if @err2 != 0 --如果转账过程出现错误
begin
rollback transaction transfer --回滚到保存点transfer处
print '转账失败,但手续费已扣'
end
else begin
commit transaction --所有操作成功,提交事务
print '转账成功'
end
end
go
并发数据库访问管理
并发数据操作引起的问题
(1)丢失更新
(2)读脏(旧)数据
(3)不可重复读
(4)幻读
封锁机制
(1)锁的类型
(2)可以锁的资源
(3)锁的兼容性
(4)死锁