我們透過 EF 的 SaveChanges() 來增刪修資料庫資料, SaveChanges() 預設使用 transaction(交易) 包資料。
EF 也另外提供 DbContextTransaction 類別讓我們使用。範例如下:
DbEntities dbEntity = new DbEntities(); using (var transaction = dbEntity.Database.BeginTransaction()) { try { dbEntity.SaveChanges(); transaction.Commit(); } catch(Exception ex) { transaction.Rollback(); } }
當有兩個以上的 DbContext ,比如需要把資料寫到兩個以上的不同資料庫,如何確保這些不同資料庫交易的一致性,EF 提供 TransactionScope 類別解決這問題。
TransactionScope
TransactionScope 內的不同資料庫連線,只要一個沒成功,就會 Rollback。
using (DBEntities db = new DBEntities()) { using (TransactionScope ts = new TransactionScope()) { // do something A db.SaveChanges(); // do something B db.SaveChanges(); ts.Complete(); } }
參考
http://blog.darkthread.net/post-2012-12-19-transactionscope-suppress.aspx
你好,我在該篇文章 https://coderwall.com/p/jnniww/why-you-shouldn-t-use-entity-framework-with-transactions
讀到不要使用transaction在EF,想跟您請教一個觀念
如果只有一個Savechange,則無需包transaction
因為若savechange前有錯,EF就不會送script到DB執行,所以有包沒包無所謂
可以這樣理解嗎? 謝謝
讚讚