如何使用'TransactionScope'这样的代码?

Onl*_*ind 4 c#

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

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

using括号中的每个子句都在同一个事务中工作,但我不明白代码如何识别数据库命令在作用域上运行而不传递事务作用域参数既不是连接的开放,也不是在执行时查询.

例如,如果我有以下代码:

var myObject = new MyObject();
var childObject = new ChildObject();
childObject.Foo(myObject);
childObject.Bar(myObject);
Run Code Online (Sandbox Code Playgroud)

我可以为变量创建一个范围myObject并使用到childObject方法而不通过参数传递吗?像这样:

using(var myObject = new MyObject())
{
     childObject.Foo(); -- Here the method use the variable myObject
     childObject.Bar(); -- Here the method use the variable myObject
}
Run Code Online (Sandbox Code Playgroud)

Jes*_*ica 7

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

  • 只需使用ThreadStatic属性标记静态. (2认同)
  • @OnlyaCuriousMind要注意`ThreadStatic`,但它有一些注意事项.例如,如果您正在分配默认值,它将仅用于导致静态构造函数运行的第一个线程 - 其他线程将使其为空(null/default) (2认同)