5

在 Linq to Entities 上使用 System.Transactions.TransactionScope 是否值得?

MS 文档中,它说 ObjectContext.SaveChanges() 中的 SQL 调用都在内部整合到一个事务中。

我们有 1 个数据库连接,即文件系统上的本地 SQLite 数据库。我们只是想确保我们对数据库的所有操作都是原子的,我们需要 TransactionScope 吗? IE 当我们调用一些删除、更新、插入等操作时,我们希望它们全部发生或根本不发生。

4

3 回答 3

3

乔恩,不,你不需要使用 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 块中抛出异常来测试这一点。

最好的祝福

于 2010-03-02T15:17:38.950 回答
1

如果您想在单个事务中包含更多ObjectContext.SaveChanges内容(例如读取您要更改的数据以及更改),那么您需要使用TransactionScope.

于 2010-03-02T15:14:40.357 回答
0

如果您需要按照 Richard 所说的进行操作,可以使用以下代码(尽管这似乎不太可能):

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;
}
于 2010-03-02T15:23:51.887 回答