事務-為什么需要事務
如,轉賬問題:
假定錢從A轉到B,至少需要兩步:
A的資金減少
然后B的資金相應增加
update bank set balance=balance-1000 where cid='0001'
update bank set balance=balance + 1000 where cid='0002'
--查看結果。
SELECT * FROM bank
注意約束:金額不能小於10
--事務
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<span style=
"font-family: 微軟雅黑, 'Microsoft YaHei'; font-size: 14px;"
>
create
table
bank
(
cId
char
(4)
primary
key
,
balance money,
--余額
)
alter
table
bank
add
constraint
CH_balance
check
(balance >=10)
go
--delete from bank
insert
into
bank
values
(
'0001'
,1000)
insert
into
bank
values
(
'0002'
,10)
go
update
bank
set
balance=balance-1000
where
cid=
'0001'
update
bank
set
balance=balance + 1000
where
cid=
'0002'
</span>
|
什么是事務(Transaction)
事務:同生共死
指訪問並可能更新數據庫中各種數據項的一個程序執行單元(unit)--也就是由多個sql語句組成,必須作為一個整體執行
這些sql語句作為一個整體一起向系統提交,要么都執行、要么都不執行
語法步驟:
開始事務:BEGIN TRANSACTION 開啟事務
事務提交:COMMIT TRANSACTION --提交操作
事務回滾:ROLLBACK TRANSACTION --取消操作
判斷某條語句執行是否出錯:
全局變量@@ERROR;
@@ERROR只能判斷當前一條T-SQL語句執行是否有錯,為了判斷事務中所有T-SQL語句是否有錯,我們需要對錯誤進行累計;
例:SET @errorSum=@errorSum+@@error
事務的ACID特性:
事務是作為單個邏輯工作單元執行的一系列操作。一個邏輯工作單元必須有四個屬性,稱為原子性、一致性、隔離性和持久性 (ACID) 屬性,只有這樣才能成為一個事務。
原子性
事務必須是原子工作單元;對於其數據修改,要么全都執行,要么全都不執行。
一致性
事務在完成時,必須使所有的數據都保持一致狀態。在相關數據庫中,所有規則都必須應用於事務的修改,以保持所有數據的完整性。事務結束時,所有的內部數據結構(如 B 樹索引或雙向鏈表)都必須是正確的。
隔離
由並發事務所作的修改必須與任何其他並發事務所作的修改隔離。事務識別數據時數據所處的狀態,要么是另一並發事務修改它之前的狀態,要么是第二個事務修改它之后的狀態,事務不會識別中間狀態的數據。這稱為可串行性,因為它能夠重新裝載起始數據,並且重播一系列事務,以使數據結束時的狀態與原始事務執行的狀態相同。
持久性
事務完成之后,它對於系統的影響是永久性的。該修改即使出現系統故障也將一直保持。
SET IMPLICIT_TRANSACTIONS { ON | OFF }
如果設置為 ON,SET IMPLICIT_TRANSACTIONS 將連接設置為隱式事務模式。如果設置為 OFF,則使連接恢復為自動提交事務模式。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<span style=
"font-family: 微軟雅黑, 'Microsoft YaHei'; font-size: 14px;"
>
select
*
from
bank
--使用事務
begin
transaction
declare
@error
int
set
@error = 0
update
bank
set
balance=balance-1000
where
cid=
'0001'
set
@error = @error + @@error
update
bank
set
balance=balance + 1000
where
cid=
'0002'
set
@error = @error + @@error
if @error != 0
rollback
transaction
else
commit
transaction
go
select
*
from
bank</span>
|
參考:雪維網 http://xuevi.com