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