C#事务范围 - L2E

5
在Linq to Entities中,是否值得使用System.Transactions.TransactionScope?
MS文档上,它说ObjectContext.SaveChanges()中的SQL调用都被内部合并为一个事务。
我们只有一个数据库连接,这是一个本地的SQLite数据库。我们只想确保我们对数据库的所有操作都是原子的,那么我们需要TransactionScope吗?即当我们调用一些删除、更新、插入等操作时,我们希望它们要么全部发生,要么全部不发生。
3个回答

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

如果你想在一个事务中包含不止 ObjectContext.SaveChanges(例如,读取你将要更改的数据以及更改),那么你需要使用 TransactionScope


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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接