Sql Server資料庫事務

2021-06-28 14:17:50 字數 4206 閱讀 4741

事務是單個的工作單元。如果某一事務成功,則在該事務中進行的所有資料修改均會提交,成為資料庫中的永久組成部分。如果事務遇到錯誤且必須取消或回滾,則所有資料修改均被清除。

舉個例子,比如你去銀行轉帳就是乙個事務。轉帳可以簡單的分為兩個步驟,一是把錢從你的帳戶中扣除,二是把錢存到你指定轉帳的帳戶中。這兩個步驟就是乙個事務,必須全部執行,或是全部不執行。如果從你帳戶扣錢成功,但是轉帳失敗,那麼你轉帳的錢就沒有了;如果是扣錢失敗了,但是轉帳成功了,那銀行就虧了。

事務是作為單個邏輯工作單元執行的一系列操作。乙個邏輯工作單元必須有四個屬性,稱為原子性、一致性、隔離性和永續性 (acid) 屬性,只有這樣才能成為乙個事務。

原子性:事務必須是原子工作單元;對於其資料修改,要麼全都執行,要麼全都不執行。

一致性:事務在完成時,必須使所有的資料都保持一致狀態。在相關資料庫中,所有規則都必須應用於事務的修改,以保持所有資料的完整性。事務結束時,所有的內部資料結構(如 b 樹索引或雙向鍊錶)都必須是正確的。

隔離:由併發事務所做的修改必須與任何其他併發事務所做的修改隔離。事務識別資料時資料所處的狀態,要麼是另一併發事務修改它之前的狀態,要麼是第二個事務修改它之後的狀態,事務不會識別中間狀態的資料。這稱為可序列性,因為它能夠重新裝載起始資料,並且重播一系列事務,以使資料結束時的狀態與原始事務執行的狀態相同。

永續性:事務完成之後,它對於系統的影響是永久性的。該修改即使出現系統故障也將一直保持。

sql server 以下列事務模式執行。

自動提交事務:每條單獨的語句都是乙個事務。

顯式事務:每個事務均以 begin transaction 語句顯式開始,以 commit 或 rollback 語句顯式結束。

隱式事務:在前乙個事務完成時新事務隱式啟動,但每個事務仍以 commit 或 rollback 語句顯式完成。

批處理級事務:只能應用於多個活動結果集 (mars),在 mars 會話中啟動的 transact-sql 顯式或隱式事務變為批處理級事務。當批處理完成時沒有提交或回滾的批處理級事務自動由 sql server 進行回滾。

sql server中有三種使用事務的方法,分別是sql語句,sqltransaction和transactionscope,下面一節將分別介紹這三種事務的使用方法。

本節主要介紹sql語句,sqltransaction和transactionscope這三種使用事務的方法。

本節的所有例子都在sql server 2008和vs 2008環境下執行通過,如果沒有sql server2008,那麼使用sql server 2005也一樣,但是sql se rver 2000上是無法執行通過的,因為某些sql語句在2000中不支援。請大家注意這點。

請先執行下面的指令碼,在本機的資料庫例項中建立測試資料庫,以方便執行例子。

[c-sharp]view plain

copy

--建庫  

if exists (select name from sys.databases where name = n'transtestdb')  

drop database [transtestdb]  

create database [transtestdb];  

--建表  

use [transtestdb]  

go  

if exists (select * from sys.objects where object_id = object_id(n'[dbo].[transtesttable]') and type in (n'u'))  

drop table [transtesttable]  

create table [dbo].[transtesttable](id int, [name] varchar(16));  

--初始值  

use [transtestdb]  

go  

insert into [transtesttable]  

select 1,'a' union  

select 2,'b' union  

select 3,'c';  

首先介紹利用sql語句來使用事務。sql server2005/2008提供了begin tran,commit tran和rollback tran三個語句來顯示的使用事務。begin tran表示事務開始,commit tran表示事務提交,rollback tran表示事務回滾。具體**如下:

[c-sharp]view plain

copy

begin try

begin tran  

insert into dbo.transtesttable values (66,'66');  

update dbo.transtesttable set [name] = '77' where [id] = 66;  

--raiserror ('error raised in try block.',16,1);  

commit tran  

end try

begin catch

rollback tran  

end catch

**中的begin try和begin catch是捕獲異常時使用的,只在sql server2005/2008中支援,sql server 2000上不支援這個語句。在begin try 和 end try之間的**執行時如果發生異常,則程式會跳轉到begin catch和end catch中執行相關的rollback tran回滾操作。在begin tran和commit tran之間就是乙個事務,insert和update必須同時成功,否則就同時失敗。raiserror 語句的意思是丟擲乙個異常,只在sql server2005/2008中支援,sql server 2000上不支援這個語句。

執行上面的**,我們會發現,插入和更新同時都成功了。把raiserror的注釋去掉後,再執行,我們會發現,插入和更新都回滾了。因為raiserror丟擲異常後,沒有執行到commit tran,而是直接執行begin catch裡面的rollback tran回滾語句了。

下面介紹sqltransaction的使用方法。sqltransaction是system.data.sqlclient命名空間下的乙個事務類,主要方法有commit()和rollback()兩個函式,更多方法和屬性請參考msdn。具體**如下:

[c-sharp]view plain

copy

static

void main(string args)  

catch (exception ex)  

finally

console.readline();  

}  

上面的**顯示了sqltransaction類的基本使用方法。首先使用sqlconnection建立連線後,sqlconn.begintransaction()表示事務的開始,在執行一些基本操作後(**是執行乙個insert和乙個update)後,執行sqltrans.commit();表示事務提交,這時候,剛才insert和update的資料在資料庫才能被使用。如果把throw new exception("test exception.the transaction must rollback");這句的注釋去掉,我們會發現,程式沒有執行提交,而是直接執行了catch中的rollback(),進行了回滾。那麼剛才的insert和update一起被回滾。

最後看一下transactionscope的基本用法。transactionscope繼承idisposable介面,所以一般在using中使用。具體**如下:

[c-sharp]view plain

copy

static

void main(string args)  

console.readline();  

}  

在using中定義了乙個transactionscope,相當於定義了乙個事務範圍即這個事務作用域為using內。程式執行了兩個動作,乙個insert,乙個update,最後執行了scope.complete();相當於提交事務。如果把scope.complete();注釋掉,我們會發現insert和update都被回滾了,因為在using作用域內,如果沒有提交命令,那麼scope在銷毀時,會自動回滾所有的操作

以上就是三種事務的基本使用方法,在此基礎之上,還可以引申出更多的問題,比如巢狀事務,三種方法的混合使用等問題。在此就不一一枚舉了。

SQLServer資料庫事務級別

efcore自動建立的資料庫在sqlserver時是read committed snapshot,sqlserver建立資料庫預設是read committed。因此記錄一下檢視和修改的方法,以便檢視修改。查詢當前資料庫事務級別 dbcc useroptions 修改資料庫事務級別 alter d...

Sql Server資料庫實驗之事務與鎖

李偉 select borrnum borrnum from borrow order by borrnum 1select bno bno from book where btitle 資料結構 select num count bno from borrow where bno bno and ...

資料庫事務

事件是訪問並可能更新各種資料項的乙個程式執行單元。事件由事務開始與事務結束之間執行的全體操作組成。為了保證資料完整性,資料庫系統需要維護事務的以下性質 原子性 atomicity 事務中的操作要麼全部成功,要麼全部失敗。一致性 consistency 事務執行前後要保持資料庫的一致性。隔離性 iso...