sql 事務-爲何須要事務,什麼是事務(Transaction)?

事務-爲何須要事務sql

如,轉帳問題:數據庫

    假定錢從A轉到B,至少須要兩步:數據結構

A的資金減小併發

而後B的資金相應增長      spa

 

update bank set balance=balance-1000 where cid='0001'code

update bank set balance=balance + 1000 where cid='0002'索引

--查看結果。 事務

    SELECT * FROM bankci

   注意約束:金額不能小於10get

 

--事務

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

相關文章
相關標籤/搜索