如何让代码像'TransactionScope'一样工作?

4

我在阅读有关C#中事务范围的内容,它的工作原理如下:

using (connectionDb)
{
    connectionDb.Open();
    using (var ts = new System.Transactions.TransactionScope())
    { <--
        try
        {
            connectionDb.ExecuteNonQuery();
            ts.Complete();
        }
        catch (Exception)
        {
            throw;
        }
        finally
        { }
    } <--
}

每个括号中的语句都在同一个事务中执行,但我不理解代码如何确定数据库命令正在作用域内运行,既没有传递事务作用域参数,也没有打开连接,也没有执行查询。
例如,如果我有以下代码:
var myObject = new MyObject();
var childObject = new ChildObject();
childObject.Foo(myObject);
childObject.Bar(myObject);

我能否创建一个作用域来存储变量myObject,并在子对象方法中使用,而无需通过参数传递?像这样:

using(var myObject = new MyObject())
{
     childObject.Foo(); -- Here the method use the variable myObject
     childObject.Bar(); -- Here the method use the variable myObject
}
1个回答

7

当您创建一个 TransactionScope 时,它会存储在静态变量 Transaction.Current 中,该变量保存在线程本地存储中。与事务交互的方法会查看此变量以确定它们所处的事务。这称为环境事务。


我之前不知道ThreadStatic属性,因为这个我给你点赞。这是一个非常有用的命令。 - Only a Curious Mind
2
@OnlyaCuriousMind 不过要小心 ThreadStatic,因为它有一些注意事项。例如,如果你正在分配一个默认值,那么它只会被用于导致静态构造函数运行的第一个线程 - 其他线程将为空(null / 默认)。 - Luaan
嘿,我有一个疑问,这种代码方式是一种设计模式吗?如果是,它叫什么名字? - Only a Curious Mind
1
我不会说这是一个设计模式,但你可以研究一下环境上下文。 - Jessica

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