c# - 如何在 C# 中将 TranscactionScope 限制为给定的 DataBaseContext?

标签 c# transactions transactionscope

当我使用这种模式时,我希望 100% 做到这一点

using (var scope = new TransactionScope())
{
    db1.Foo.InsertOnSubmit(new Foo()); // just an example
    db1.SubmitChanges();
    scope.Commit();
}

事务范围将仅引用 db1 而不是 db2(db1 和 db2 是 DataBaseContext 对象)。那么如何将范围限制为仅 db1 呢?

提前谢谢您。

最佳答案

TransactionScope 的优势在于它会自动捕获其中的所有内容,直至调用堆栈(除非另一个 TransactionScope 具有 RequiresNew抑制)。如果这不是您想要的,您应该使用另一种机制进行事务处理。

一种方法是打开 SqlConnection 并调用 BeginTransaction 来获取事务,然后在创建数据上下文时使用该数据库连接。 (也许您必须在数据上下文上设置 Transaction 属性,我不确定)。

在上面给出的示例中,使用 TransactionScope 是完全多余的。只有一个函数调用实际修改数据库:SubmitChanges,并且如果尚不存在事务,它总是创建自己的事务。原因是,当您执行多个操作时,SubmitChanges 要么全部成功,要么全部失败。如果您只追求单个数据上下文的单个 SubmitChanges 调用的事务完整性,那么您可以删除 TransactionScope

关于c# - 如何在 C# 中将 TranscactionScope 限制为给定的 DataBaseContext?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5510766/

相关文章:

c# - 如何使用泛型来处理 Action<IBuilder<T>> 中特定于类型的配置?

java - 如何在我自己的事务中包装对象更改并将其与 Hibernate 合并到 JTA?

c# - linq to sql事务

c# - 如何在 .NET Core 代码的单元测试中提供 ILogger<T>?

c# - WPF NotifyIcon 首次运行时崩溃 - VisualTarget 的根视觉对象不能有父对象

sql - 防止 SELECT 检索事务开始后提交的行

sqlite - flutter sqlite 事务使用错误警告数据库已被锁定

.net - 在事务范围内打开一个sql连接重要吗

NHibernate、事务和 TransactionScope

c# - 如何枚举 MVC 5 viewbag