當前位置:成語大全網 - 漢語詞典 - 事務回滾簡介

事務回滾簡介

的。NET Framework開發人員指南事務是壹組組合成邏輯工作單元的操作。雖然系統中可能存在錯誤,但事務會控制和維護事務中每個操作的壹致性和完整性。例如,在將資金從壹個帳戶轉移到另壹個帳戶的銀行應用程序中,壹個帳戶將壹定的金額記入壹個數據庫表的貸方,而另壹個帳戶將相同的金額記入另壹個數據庫表的借方。因為電腦可能會因為停電、網絡中斷等原因而出現故障。,可以更新壹個表中的行,但不能更新另壹個表中的行。如果數據庫支持事務,可以將數據庫操作分組到壹個事務中,以防止數據庫由於這些事件而不壹致。如果事務中的某個點失敗,所有更新都可以回滾到事務開始之前的狀態。如果沒有失敗發生,則通過在完成狀態下提交事務來完成更新。英寸net中,您可以使用連接和事務對象來控制事務。妳可以使用連接。BeginTransaction啟動本地事務。壹旦事務啟動,就可以使用Command對象的Transaction屬性在事務中註冊命令。然後,根據事務組件的成功或失敗,您可以使用事務對象提交或回滾數據源中所做的更改。也可以使用連接。登記分布式事務以在現有分布式事務中註冊。在現有分布式事務中註冊可以確保當整個分布式事務被提交或回滾時,對數據源所做的代碼修改也被提交或回滾。下面的示例創建壹個OleDbConnection和壹個OleDbTransaction。它還演示如何使用BeginTransaction、Commit和Rollback方法。

public void RunOleDbTransaction(string my connstring){ oledb connection my connection = new oledb connection(my connstring);我的連接。open();oledb command my command = my connection。create command();OleDbTransaction myTrans

//啟動本地事務myTrans = myConnection。begin transaction(isolation level。重新提交);//為掛起的本地事務myCommand分配事務對象。Connection = myConnection我的命令。Transaction = myTrans試試{ myCommand。CommandText =/Insert into Region(Region id,RegionDescription)值(100,/' Description/')/;我的命令。ExecuteNonQuery();我的命令。CommandText =/Insert into Region(Region id,RegionDescription)值(101,/' Description/')/;我的命令。ExecuteNonQuery();我的車。commit();控制臺。WriteLine(/兩個記錄都寫入數據庫。/);} catch(異常e) { try { myTrans。roll back();} catch(oledb exception ex){ if(myTrans。連接!= null) {控制臺。WriteLine(/類型/ + ex的異常。嘗試回滾事務時遇到GetType() + /。/);} }

控制臺。WriteLine(/插入數據時遇到/ + e.GetType() + /類型的異常。/);控制臺。WriteLine(/兩個記錄都沒有寫入數據庫。/);}最後{ myConnection。close();} }

OleDbTransaction。Commit方法提交數據庫事務。公共虛擬void Commit();OleDbTransaction。Rollback方法將事務從掛起狀態回滾。public虛擬void roll back();oledbconnection。begintransaction方法啟動數據庫事務。public oledb transaction begin transaction();使用當前IsolationLevel值啟動數據庫事務。public oledb transaction begin transaction(isolation level);IsolationLevel枚舉?指定連接的事務鎖定行為。當執行事務時。NET Framework數據提供程序使用IsolationLevel值。IsolationLevel在顯式更改之前壹直有效,但可以隨時更改。新值在執行時使用,而不是在分析時使用。如果在事務期間更改了鎖定級別,服務器的預期行為是將新的鎖定級別應用於所有剩余的語句。IsolationLevel成員ReadCommitted在讀取數據時保持* * *鎖定,以避免臟讀,但可以在事務結束前更改數據,從而導致不可重復的讀取或幻像數據。OleDbConnection。CreateCommand方法創建並返回與OleDbConnection關聯的OleDbCommand對象。公共oledb command create command();OleDbCommand。Connection屬性獲取或設置此OleDbCommand實例使用的OleDbConnection。公共OleDbConnection連接{ get設置;}

如何在中實現交易?NET (1)如何在?網?壹般可以用兩種方法:直接寫入sql使用。net實現。下面依次介紹:方法1:使用begin trans、commit trans和rollback trans直接寫入sql:例如begin Trans declare @ Order Details ERROR int、@ product ERROR int DELETE FROM/Order Details/WHERE product id = 42 SELECT @ Order Details ERROR = @ @ ERROR DELETE FROM product WHERE product id = 42 SELECT @ product ERROR = @ @ ERROR IF @ Order Details ERROR = 0 and @ product irror = 0 Commit Trans LSE roll back Trans Trans這種方法比較簡單,詳情請參考相關sql server幫助。

方法二:使用。net實現。這種方法的優點是可以在中間層管理事務,但也可以選擇在數據層實現。SqlConnection和OleDbConnection對象具有BeginTransaction方法,該方法可以返回SqlTransaction或OleDbTransaction對象。此外,該對象有提交和回滾方法來管理事務。具體例子如下:

cnNorthwind。open()Dim trans As SQL transaction = cnnorth wind。BeginTransaction() Dim cmDel作為新的SqlCommand() cmDel。Connection = cnNorthwind cmDel。交易=交易

試試cmDel。CommandText = _/DELETE[訂單詳細信息]其中ProductID = 42/ cmDel。ExecuteNonQuery() cmDel。CommandText =/DELETE Products WHERE product id = 42/cmDel。ExecuteNonQuery() trans。提交()

將Xcp作為異常事務捕獲。Rollback() Finally cnNorthwind。Close()結束嘗試

好了,上面的例子可以達到和方法1壹樣的效果。

並發問題:

如果沒有鎖,並且多個用戶同時訪問壹個數據庫,當他們的事務同時使用相同的數據時,可能會出現問題。並發問題包括:更新丟失或被覆蓋、未確認的關聯(臟讀)、不壹致的分析(非重復讀)和幻影讀。但是如何避免讀取數據時出現臟讀等問題呢?