Home [SQL筆記] Begin Transaction 交易(事務)
Post
Cancel

[SQL筆記] Begin Transaction 交易(事務)

begin transactioncommit transactionrollback 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

This post is licensed under CC BY 4.0 by the author.