簡體   English   中英

如何回滾與LINQ to SQL相關的事務?

[英]How is rolling back transaction related to LINQ to SQL?

問題僅在於回滾更改,而不是提交。

假設我獲取了一些數據,對它們進行了更改,然后提交了更改(可選步驟)並回滾了事務。 無論您在哪里看每位作者寫的內容,都將取消更改。

但是我發現這是正確的-LINQ DataContext將保留更改的數據! 我使用TransactionScope和DataContext.Transaction對此進行了測試。 在這兩種情況下,我都有相同的行為。

一種解決方法是在回滾后重新創建DataContext(但是這會導致其他問題,例如緩存數據和處理嵌套事務)或手動丟棄DataContext中的更改。 但是,這些只是解決方法。

問題

那我想念什么呢? LINQ to SQL是否不適合事務處理? 如何使用事務以便它們真正回滾更改?

                MyTable record = null;

                db.Connection.Open();
                using (db.Transaction = db.Connection.BeginTransaction())
                {
                        record = db.MyTable.First();
                        record.BoolField = !record.BoolField; // changed
                        db.SubmitChanges();
                        db.Transaction.Rollback();
                }

數據上下文應被視為工作單元。 您可以根據自己的需要來確定粒度 -它可以是頁面請求,也可以是單個操作; 但是-如果您遇到異常(或幾乎所有意外的事情),請停止 放棄數據上下文和回滾。 回滾后,您的數據上下文將變得混亂,因此請不要保留它

另外; 保留數據上下文的時間不要超過必要的時間。 它不打算用作應用程序級數據緩存。

您似乎想要的是數據庫(或其一部分)的內存中緩存,而不是輕量級的ORM。 我想說LINQ to SQL既適合事務處理,又適合作為輕量級的ORM,但不能很好地用作數據庫緩存。 我認為,使用“工作單位”模式可以使數據上下文發揮最佳作用。 為特定任務創建上下文,執行任務,然后處置上下文。 如果任務恰好包含失敗的事務,那么您需要弄清楚如何響應失敗。 這可以通過糾正錯誤並使用現有上下文重試,或者在Web上下文中,將嘗試的更改傳回給用戶,然后在重新提交數據時使用新的上下文再次嘗試。

兩件事情:

1)過時的數據上下文

您觀察到的通常稱為“過時的”數據上下文。 數據上下文中的實體不會注意到您的rollbak。 如果您在submitchanges之后執行存儲過程,則會得到類似的行為。 數據上下文也不會注意到這一點。 但是,您的事務將在數據庫中回滾! (同樣,將執行存儲過程)

2)關於交易

無需管理交易。 Linq2Sql已經在Submitchanges中為您創建了一個事務。 如果您確實要管理事務(例如,通過多個數據上下文或結合了linq2sql的存儲過程),請將整個內容包裝在TransactionScope中。在要提交的位置調用transaction.Complete()。

暫無
暫無

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

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