我做了一個簡單的測試,以瞭解交易.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環境下進行。
但是,數據庫如何知道更多查詢仍在隊列中執行。所有查詢都是原子的。與數據庫的連接是否始終被視爲單個事務? – 2010-08-04 10:50:15
它不知道還有更多的東西,它只知道COMMIT命令沒有被調用,所以自事務開始以來的任何事情都應該回滾。 – cjk 2010-08-04 10:54:33
但是誰在調用Commit命令。沒有人通知數據庫,當事務開始時以及它被提交時,除非我們明確指定事務,否則每個查詢都被視爲單個事務,那麼數據庫如何才能知道完整批次必須被視爲單個事務。因此調用commit – 2010-08-04 11:00:15