gpt4 book ai didi

c# - 忽略 TransactionScope 中的 SqlTransaction.Commit

转载 作者:太空狗 更新时间:2023-10-29 21:23:43 34 4
gpt4 key购买 nike

我们正在逐步用 Entity Framework (4.3.1) 替换遗留数据访问代码。在某些情况下,我们无法避免在一个工作单元中同时使用两种数据访问方式。理想情况下,这应该在一次交易中完成。但是,旧代码使用 SqlTransaction,当一个工作单元完成并且 EF 管理自己的事务时调用 Commit()

所以我们想到将“旧”和"new"代码包装在 TransactionScope 中.但是,始终执行周围 TransactionScope 中的 Commit,即使 TransactionScope 未完成。此代码片段说明了我的问题:

using (var conn = new SqlConnection("connection string"))
{
conn.Open();
using (var scope = new TransactionScope())
{
using (var tr = conn.BeginTransaction())
{
using (var cmd = conn.CreateCommand())
{
cmd.Transaction = tr;
cmd.CommandText = "some update statement";
cmd.ExecuteNonQuery();
}
tr.Commit();
}
// In reality the code above is part of a legacy DAL, immutable.
// (can't insert SaveChanges before tr.Commit).
context.SaveChanges();
if (<all ok>) // pseudo code for exception handling.
scope.Complete();
}
}

scope.Complete() 未命中时,更新语句仍在提交

看起来,我无法使用 TransactionScope 强制旧数据访问代码和来自上下文的 SaveChanges 在一个事务中执行。 或者有没有办法否决 SqlTransaction.Commit 语句?

我知道这里有更多关于 TransactionScope 和 SqlTransaction 的帖子,但他们都(正确地)说在使用 TransactionScope 时不需要(也不推荐)使用 SqlTransaction。但不使用 SqlTransaction 在这里不是一个选项。我们有一个遗留框架,它提交自己的 SqlTransaction,并且没有用于挂接到其事务机制的 API。

最佳答案

The update statement is still committed when scope.Complete() is not hit.

哦不!未使用 TransacationScope1

如果连接在 TransactionScope 之后(或内部)打开,则自动登记有效。

Open 放在 TransactionScope 应该解决这个问题(即使是手动交易?)作为然后 Connection [通常] 会在环境 TS 上下文中自动登记。

可以将现有连接纳入环境事务范围:connection.EnlistTransaction(Transaction.Current)

或者,TS 可以从现有交易中创建,例如new TransactionScope(transaction),这在这里可能有帮助也可能没有帮助。

如果完全没问题,则创建手动交易,但 TS(在找出陷阱之后!)使处理交易变得更加简单和容易.. 至少在大多数情况下 :)

编码愉快!


1 TS 未用于“更新语句”。它仍然 [可能] 用于 context.SaveChanges(),因为这将打开一个连接,然后自动登记。

虽然我不确定普通的“嵌套”事务,但我在上面提供了一些选项。查看在上下文中使用的(密封的?)API 可能会揭示有关限制/限制的更多见解。

关于c# - 忽略 TransactionScope 中的 SqlTransaction.Commit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11418301/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com