簡體   English   中英

回滾c#

[英]Roll back in c#

我有2個表查詢和詳細信息。 在保存按鈕上單擊我已寫入

fbsave();
fbsavedetails();

fbsave()將數據保存在查詢表中, fbsavedetails()將數據保存在詳細信息表中。

現在,如果fbsavedetails()發生錯誤,則兩個步驟都應該回滾。

可能嗎?

您可以顯式創建一個事務並傳遞它,即

using(var connection = ...)
{
    connection.Open();
    using (var tran = connection.BeginTransaction())
    {
        try
        {
            FBSave(connection, tran);
            FBSaveDetails(connection, tran);
            tran.Commit();
        }
        catch
        {
            tran.Rollback();
            throw;
        }
    }
}

請注意,此處還必須在每個命令上設置Transaction ,因此需要將其傳入,並且所有命令必須位於同一連接對象上。


或者:您可以使用TransactionScope ; 重要的是,在TransactionScope 內部發生Open()以獲得自動登記:

using(var tran = new TransactionScope())
{
    FBSave();
    FBSaveDetails();
    tran.Complete();
}

要么:

using(var tran = new TransactionScope())
using(var connection = ...)
{
    connection.Open();
    FBSave(connection);
    FBSaveDetails(connection);
    tran.Complete();
}

使用TransactionScope方法,您不需要設置任何特殊的東西 - 大多數都是自動的。 您當然可以選擇將連接傳遞給方法,但是它們也可以獲得自己的連接,並且在大多數情況下它可以正常工作。

您可以使用TransactionScope。

using(var scope = new TransactionScope())
{
   //Complete the transaction only when both inserts succeed. 
   scope.Complete();
}

如果您沒有完成transactioncope,它將被回滾。

有兩種方法可以解決這個問題

  1. 使用DbTransaction並在兩個方法周圍傳遞DbTransaction,如果成功則提交事務,如果發生錯誤則回滾:需要傳遞DbTransaction。
  2. 使用TransactionScope專業版:易於使用缺點:不支持訪問,如果數據庫是sql2000,則需要配置msdtc

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM