SQL事務

weixin_30639719發表於2020-04-05

--例項:張三轉800元到李四賬戶上

if exists(select * from sysobjects where name='bank')
drop table bank
create table bank
(
customerName char(10), --顧客姓名
currentMoney money --當前餘額
)

--新增約束 ,賬戶不能少於1元
alter table bank add
constraint CK_currentMoney check(currentMoney>=1)

--插入測試資料

insert into bank(customerName,currentMoney)
select 'zhangs',1000 union
select '李四',1

select * from bank

/*方法一: 通過判斷Error來回滾事務*/
--開始 事務
begin transaction --開始 事務
declare @errorSum int =0 --定義變數,用於累計事務執行過程中的錯誤
update bank set currentMoney=currentMoney-200 where customerName='zhangs'
set @errorSum=@errorSum+@@ERROR --累計是否有錯誤
update dbo.bank set currentMoney=currentMoney+200 where customerName='李四'
set @errorSum=@errorSum+@@ERROR --累計是否有錯誤
print @errorSum

if @errorSum>0
begin rollback transaction --事務回滾
--print '1'
end
else
begin commit transaction --提交事務
end
/*方法二:設定 xact_abort ON*/
set xact_abort ON --如果不設定該項為ON,在SQL中預設為OFF,那麼只回滾產生錯誤的Transaction-SQl語句;設為ON,回滾整個事務
begin transaction --開始 事務
update bank set currentMoney=currentMoney-200 where customerName='zhangs'
update dbo.bank set currentMoney=currentMoney+200 where customerName='李四'
commit transaction --提交事務
select * from bank

/*方法三:try */
begin try
begin transaction --開始 事務
update bank set currentMoney=currentMoney-200 where customerName='zhangs'
update dbo.bank set currentMoney=currentMoney+200 where customerName='李四'
commit transaction --提交事務
end try
begin catch
if @@trancount>0
rollback
declare @ErrMsg nvarchar(4000),@ErrSeverity int
select @ErrMsg=ERROR_MESSAGE(),
@ErrSeverity=ERROR_SEVERITY()

raiserror(@ErrMsg,@ErrSeverity,1)
end catch

select * from bank

轉載於:https://www.cnblogs.com/WarBlog/p/4444657.html

相關文章