2010-08-04 35 views
1

我做了一個簡單的測試,以瞭解交易.NET是如何工作的如何.NET的交易上的SQL Server數據庫時進行了小分析

上我的交易測試已完成的示例代碼是

_sqlHelper = new SqlHelper(true); 
try 
{ 
    _sqlHelper.ExecuteNonQuery(SpName.sp_UpdateRoomStatus.ToString() 
     , Parameters.SqlParam<int?>("DepartmentId", this.DepartmentId, SqlDbType.Int) 
     ); 

    _sqlHelper.ExecuteNonQuery(SpName.sp_UpdateRoomStatus.ToString() 
     , Parameters.SqlParam<int?>("DepartmentId", this.DepartmentId, SqlDbType.Int) 
     ); 

    _sqlHelper.CommitTransaction(); 
} 
catch (SqlHelperException ex) 
{ 
    _sqlHelper.RollBackTransaction(); 
} 

說明關於測試

當我寫入新提供SQLHelper(真);一個新的事務在內部開始,連接已經創建並打開到數據庫。

_sqlHelper.ExecuteNonQuery(SpName.sp_UpdateRoomStatus.ToString() 
    , Parameters.SqlParam<int?>("DepartmentId", this.DepartmentId, SqlDbType.Int) 
    ); 

上面的函數執行我的過程並在數據庫中執行更改。

我寫了兩次相同的函數調用來執行兩次過程。該過程在數據庫中進行插入。此過程在3個不同的表中包含3個插入查詢。 現在我標記了兩個函數調用的斷點。

只要第一個斷點處於控制狀態,我就簡單地讓它的處理完成,這意味着第一個程序已經完成了插入。

現在我拔掉了我的LAN線,因爲DB在遠程系統上。這意味着連接丟失。因此事務被回滾。

現在當我在整個過程完成後驗證數據庫。我發現數據處於一致狀態,從而證明交易正在進行。

我很困惑,因爲程序成功執行,此時從第一個過程調用發生了實際插入。 sql服務器如何得知通知事務正在進行並且必須進行回滾。

看起來好像連接已建立到數據庫通知連接包含事務,並且應該在連接丟失時回滾。

因此也說明所做的更改在數據庫而不是.net環境下進行。

回答

1

數據庫知道連接和更改應該在事務中 - 實際更改和原始數據存儲在數據庫事務日誌中。當事務未正確提交併且連接丟失時,數據庫自動回滾事務。

基本上,在SqlTransactions(不是分佈式的)中,.Net沒有什麼聰明,它都是由數據庫處理的。

+0

但是,數據庫如何知道更多查詢仍在隊列中執行。所有查詢都是原子的。與數據庫的連接是否始終被視爲單個事務? – 2010-08-04 10:50:15

+0

它不知道還有更多的東西,它只知道COMMIT命令沒有被調用,所以自事務開始以來的任何事情都應該回滾。 – cjk 2010-08-04 10:54:33

+0

但是誰在調用Commit命令。沒有人通知數據庫,當事務開始時以及它被提交時,除非我們明確指定事務,否則每個查詢都被視爲單個事務,那麼數據庫如何才能知道完整批次必須被視爲單個事務。因此調用commit – 2010-08-04 11:00:15

相關問題