sql 事務-為什么需要事務,什么是事務(Transaction)?


事務-為什么需要事務

如,轉賬問題:

    假定錢從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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM