begin transaction、commit transaction、rollback transaction
要馬同時成功,要馬同時失敗。
- check 約束:
alter table BankCard add constraint ck_money check(CardMoney >= 0) @@error沒有報錯@@error=0,不是0就是有問題的代碼
begin transaction, commit transaction, rollback transaction
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
begin transaction --開始交易
declare @myError int = 0--定義錯誤變量
--SQL語句,每一句SQL語句後面跟著設置累加錯誤訊息
set @myError = @myError + @@ERROR --累加錯誤訊息
--SQL語句
set @myError = @myError + @@ERROR --累加錯誤訊息
...
if @myError = 0 --不是0就是有問題的代碼
begin
commit transaction--提交
print '取款成功'
end
else
begin
rollback transaction--返回狀態
print '取款失敗'
end
取款
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
--(1)假設張三取款6000,(添加check約束,設置帳戶餘額必須>=0)
--要求:使用交易實現,修改餘額和添加取款記錄兩步操作使用交易
--Step1: 添加check約束:BankCard有缺陷,先將之前的BankCard加上約束
alter table BankCard add constraint ck_money check(CardMoney >= 0)
--Step2: 使用交易實現
begin transaction --開始交易
declare @myError int = 0--定義錯誤變量
--張三取款6000
update BankCard set CardMoney = CardMoney - 6000 where CardNo='999998888800'
--累加錯誤訊息
set @myError = @myError + @@ERROR
--新增交易記錄
insert into CardExchange(CardNo,MoneyInBank,MoneyOutBank,ExchangeTime)
values('999998888800',0,6000,GETDATE())
--累加錯誤訊息
set @myError = @myError + @@ERROR
if @myError = 0
begin
commit transaction
print '取款成功'
end
else
begin
rollback transaction
print '取款失敗'
end
轉帳
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
--(2)假設張三向李四轉帳1000,,(添加check約束,設置帳戶餘額必須>=0)
--分析步驟有三步:(1)李四加1000元(2)張三扣1000元(3)生成轉帳記錄;
--使用交易解決此問題
begin transaction
declare @myError int = 0
--(1)李四加1000元
update BankCard set CardMoney = CardMoney + 1000 where CardNo = '999998888801'
set @myError = @myError + @@ERROR
--(2)張三扣1000元
update BankCard set CardMoney = CardMoney - 1000 where CardNo = '999998888800'
set @myError = @myError + @@ERROR
--(3)生成轉帳記錄
insert into CardTransfer(CardNoOut,CarNoIn,TransferMoney,TransferTime)
values('999998888800','999998888801',1000,GETDATE())
set @myError = @myError + @@ERROR
if @myError = 0
begin
commit transaction
print '交易成功'
end
else
begin
rollback transaction
print '交易失敗'
end
MSDN BEGIN TRANSACTION (Transact-SQL) MSDN 交易 (Transact-SQL)
https://www.bilibili.com/video/BV1XV411C7TP?p=23