c 事務的使用 示例及注意事項

2021-05-11 03:37:25 字數 3557 閱讀 7746

一、事務的介紹

.net framework 開發員指南

事務是一組組合成邏輯工作單元的操作,雖然系統中可能會出錯,但事務將控制和維護事務中每個操作的一致性和完整性。

例如,在將資金從乙個帳戶轉移到另乙個帳戶的銀行應用中,乙個帳戶將一定的金額貸記到乙個資料庫表中,同時另乙個帳戶將相同的金額借記到另乙個資料庫表中。由於計算機可能會因停電、網路中斷等而出現故障,因此有可能更新了乙個表中的行,但沒有更新另乙個表中的行。如果資料庫支援事務,則可以將資料庫操作組成乙個事務,以防止因這些事件而使資料庫出現不一致。如果事務中的某個點發生故障,則所有更新都可以回滾到事務開始之前的狀態。如果沒有發生故障,則通過以完成狀態提交事務來完成更新。

在 ado.net 中,可以使用 connection 和 transaction 物件來控制事務。可以使用 connection.begintransaction 啟動本地事務。一旦開始乙個事務,就可以使用 command 物件的 transaction 屬性在該事務中登記命令。然後,可以根據事務元件的成功或失敗情況,使用 transaction 物件提交或回滾在資料來源中所做的修改。

還可以使用 connection.enlistdistributedtransaction 在現有的分布式事務中登記。在現有的分布式事務中登記可以確保當提交或回滾整個分布式事務時,也提交或回滾對資料來源所作的**修改。

以下示例建立乙個 oledbconnection 和乙個 oledbtransaction。它還演示了如何使用 begintransaction、commit 和 rollback 方法。

public void runoledbtransaction(string myconnstring)

catch(exception e)

catch (oledbexception ex)

}console.writeline(/"an exception of type /" + e.gettype() +

/" was encountered while inserting the data./");

console.writeline(/"neither record was written to database./");

}finally

}oledbtransaction.commit 方法

提交資料庫事務。

public virtual void commit();

oledbtransaction.rollback 方法

從掛起狀態回滾事務。

public virtual void rollback();

oledbconnection.begintransaction 方法

開始資料庫事務。

public oledbtransaction begintransaction();

以當前的 isolationlevel 值開始資料庫事務。

public oledbtransaction begintransaction(isolationlevel);

isolationlevel 列舉?

指定連線的事務鎖定行為。 在執行事務時,.net framework 資料提供程式使用 isolationlevel 值。在顯式更改之前,isolationlevel 保持有效,但是可以隨時對它進行更改。新值在執行時使用,而不是在分析時使用。如果在事務期間更改,伺服器的預期行為是,對其餘所有語句應用新的鎖定級別。

isolationlevel成員 readcommitted

在正在讀取資料時保持共享鎖,以避免髒讀,但是在事務結束之前可以更改資料,從而導致不可重複的讀取或幻像資料。

oledbconnection.createcommand 方法

建立和返回乙個與 oledbconnection 相關聯的 oledbcommand 物件。

public oledbcommand createcommand();

oledbcommand.connection 屬性

獲取或設定 oledbcommand 的此例項使用的 oledbconnection。

public oledbconnection connection

如何在.net中實現事務(1)

如何在.net中實現事務機制呢? 通常可以使用2種方式: 直接寫入到sql 中;使用ado.net 實現。下面依次作一下介紹:

方法1:直接寫入到sql 中

使用 begin trans, commit trans, rollback trans 實現:

例如 begin trans

declare @orderdetailserror int, @producterror int

delete from /"order details/" where productid=42

select @orderdetailserror = @@error

delete from products where productid=42

select @producterror = @@error

if @orderdetailserror = 0 and @producterror = 0

commit trans

else

rollback trans

這種方法比較簡單,具體可以查閱相關sql server 幫助

方法2 :使用ado.net 實現,使用這種方式的優點是可以在中間層來管理事務,當然你也可以選擇在資料層來實現。

sqlconnection 和oledbconnection 物件有乙個 begintransaction 方法,它可以返回 sqltransaction 或者oledbtransaction 物件。而且這個物件有 commit 和 rollback 方法來管理事務,具體例子如下:

cnnorthwind.open()

dim trans as sqltransaction = cnnorthwind.begintransaction()

dim cmdel as new sqlcommand()

cmdel.connection = cnnorthwind

cmdel.transaction = trans

try

cmdel.commandtext = _

/"delete [order details] where productid = 42/"

cmdel.executenonquery()

cmdel.commandtext = /"delete products where productid = 42/"

cmdel.executenonquery()

trans.commit()

catch xcp as exception

trans.rollback()

finally

cnnorthwind.close()

end try

ok,通過上面的例子可以實現與方法1同樣的效果。

併發問題:

事務注意事項

注意事項 1.在需要事務管理的地方加 transactional註解。transactional 註解可以被應用於介面定義和介面方法 類定義和類的 public 方法上。transactional註解只能應用到 public 可見度的方法上。如果你在 protected private 或者 pac...

事務的注意事項

a.乙個功能是否要事務,必須納入設計 編碼考慮。不能僅僅完成了基本功能就ok。b.如果加了事務,必須做好開發環境測試 測試環境也盡量觸發異常 測試回滾 確保事務生效。c.以下列了事務使用過程的注意事項,請大家留意。1.不要在介面上宣告 transactional 而要在具體類的方法上使用 trans...

EJB 事務注意事項

在上篇文章我們提到 當執行多個事務的時候 並且這些事務方式資料庫中的相同資料會出現一系列的併發問題 這些問題彙總起來總共有以下幾類.丟失更新 撤銷乙個事務時,把其他事務已提交的更新資料覆蓋。髒讀 乙個事務讀到另乙個事務為提交的更新資料。不可重複讀 乙個事務讀到另乙個事務已提交的更新資料。幻像讀 乙個...