SQL —— 事务处理

设置中断以自动回滚事务

  • 默认情况下,如果SQL语句出现错误,那么,出错的语句不会生效,之前和之后的语句会正常执行
-- 默认情况 SET XACT_ABORT OFF
print 4
print 2/0	// 该句会报错,但不会影响上下两句
print 4
  • 如果开启中断,设置 SET XACT_ABORT ON
  • 那么在批处理情况下,出错的语句不会生效,并从该处停止,后面的代码也不会执行
SET XACT_ABORT ON
print 4
print 2/0	-- 该句会报错,但不会影响上面已执行的代码
print 4		-- 该句也会不执行,因为开启了中断
  • 如果设置了SET XACT_ABORT ON,且在事务中出现了错误,会自动进行事务回滚
SET XACT_ABORT ON	-- 开启中断
BEGIN TRANSACTION	-- 开始事务 
print 4		-- 因错误回滚,相当于未执行过
print 2/0	-- 该句会报错,并且事务中的代码都会回滚(ROLLBACK),即相当于未执行过
print 4		-- 因中断不会执行

事务回滚

  • 如果没有设置事务的存档点,那么,通过ROLLBACK TRANSACTION 会回滚整个事务
BEGIN TRANSACTION -- 开启事务
UPDATE bank SET currentMoney=currentMoney-1000 WHERE customerName="张三"
UPDATE bank SET currentMoney=currentMoney+1000 WHERE customerName="李四"
ROLLBACK TRANSACTION	-- 上面两句代码都会被回滚,相当于未执行过
  • 如果有设置事务的存档点,那么,可以在ROLLBACK TRANSACTION 后面带上存档名,这样可以回滚部分事务
BEGIN TRANSACTION -- 开启事务
UPDATE bank SET currentMoney=currentMoney-1000 WHERE customerName="张三"	-- 正常执行
SET TRANSATION save_demo	-- 设置事务存档
UPDATE bank SET currentMoney=currentMoney+1000 WHERE customerName="李四"	-- 被回滚
ROLLBACK TRANSACTION save_demo	-- 回滚到save_demo处,相当于只回滚了 '李四',而'张三'不受影响

事务回滚常用模式

  • @@error 检查模式
-- 添加约束
ALTER TABLE EMPloyee_tanlei2
ADD CONSTRAINT CK_SAL CHECK(SALARY_谭>=0 and SALARY_谭 <= 60000)

-- 错误计数
declare @@errorCount int
set @@errorCount = 0
-- 开始事务
begin transaction
insert into Employee_tanlei2 (FNAME_谭, LNAME_谭, SSN_谭, SEX_谭, SALARY_谭)
Values ('谭', '磊', '123456789', '男', 80000)
-- 读取上一句代码的错误
set @@errorCount += @@error

delete Department_tanlei2 where DNAME_谭 = '总部'
set @@errorCount += @@error

-- 错误判断
if @@errorCount > 0 begin
	rollback transaction	-- 回滚事务
end
else begin
	commit transaction		-- 提交事务
end

  • try-catch 捕获模式
-- 添加约束
ALTER TABLE EMPloyee_tanlei2
ADD CONSTRAINT CK_SAL CHECK(SALARY_谭>=0 and SALARY_谭 <= 60000)

-- 开始事务
begin transaction
-- 开始捕获
begin try
	insert into Employee_tanlei2 (FNAME_谭, LNAME_谭, SSN_谭, SEX_谭, SALARY_谭)
	Values ('谭', '磊', '123456789', '男', 80000)
	delete Department_tanlei2 where DNAME_谭 = '总部'
	
	commit transaction		-- 提交事务
end try
-- 处理异常
begin catch
	rollback transaction	-- 回滚事务
end catch

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tanleiDD

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值