数据库的并发控制(事务)

数据库的并发控制(事务)

管理事务

事务的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)死锁

发布了48 篇原创文章 · 获赞 29 · 访问量 4288

猜你喜欢

转载自blog.csdn.net/qq_43573718/article/details/104173537