是否值得在Linq to Entities上使用System.Transactions.TransactionScope?
在MS documentation上,它表示ObjectContext.SaveChanges()中的SQL调用都在内部集成到一个事务中。
我们有1个数据库连接,即文件系统上的本地SQLite数据库。我们只是想确保我们对数据库的所有操作都是原子的,我们需要TransactionScope吗? 即。当我们要求删除,更新,插入等时,我们希望它们全部发生或根本不发生。
答案 0 :(得分:3)
Jon,不,你不需要使用TransactionScope。 Linq自动处理乐观并发。您提供的链接中的代码示例解释说,您不必自己回滚事务。我会使用与示例中相同的代码:
try
{
// Try to save changes, which may cause a conflict.
int num = context.SaveChanges();
Console.WriteLine("No conflicts. " +
num.ToString() + " updates saved.");
}
catch (OptimisticConcurrencyException)
{
// Resolve the concurrency conflict by refreshing the
// object context before re-saving changes.
context.Refresh(RefreshMode.ClientWins, orders);
// Save changes.
context.SaveChanges();
Console.WriteLine("OptimisticConcurrencyException "
+ "handled and changes saved");
}
请注意刷新,重新保存,它可以处理您的问题。您可以通过从try块中抛出异常来测试它。
最好的问候
答案 1 :(得分:1)
如果您想在单个事务中包含多于ObjectContext.SaveChanges
(例如,您要更改的数据读取以及更改),则需要使用TransactionScope
。
答案 2 :(得分:0)
如果你需要做理查德所说的话,你可以使用以下代码(虽然看起来不太可能):
TransactionManager transactionManager = null;
try
{
bool isBorrowedTransaction = ConnectionScope.Current.HasTransaction;
transactionManager = ConnectionScope.ValidateOrCreateTransaction(true);
//MANY SAVES
if (!isBorrowedTransaction && transactionManager != null && transactionManager.IsOpen)
transactionManager.Commit();
}
catch (Exception ex)
{
if (transactionManager != null && transactionManager.IsOpen)
transactionManager.Rollback();
log.Error("An unexpected Exception occurred", ex);
throw;
}