C# 嵌套事务

C# nested transactions

我对下面显示的代码有疑问。

try
{
     using (TransactionScope outerTransScope = new TransactionScope(TransactionScopeOption.RequiresNew))
     {
          // 1.Change values in certain columns from the SQL database table

          using (TransactionScope innerTransScope = new TransactionScope(TransactionScopeOption.RequiresNew))
          {
               // 2.Update a column from the SQL database table by using the changed values from the outerTransScope as a JOIN condition.

               // 3.Commit the update query
               innerTransScope.Complete();
          }
     }
     // 4.Rollback the changed values that were executed in the outerTransScope
}
catch (Exception)
{
// Log the exception
}

我可以说这不会像我预期的那样工作吗?由于 outerTransScope 实际上正在回滚 innerTransScope,因为我从未提交过 outerTransScope。

这意味着您只能在根事务最后提交的情况下提交嵌套事务。如果未提交根事务,则即使您提交了内部事务,也会回滚所有嵌套事务。

是否可以通过任何方式获得上面代码中显示的功能?提前致谢。

编辑: 假设我们有两个 tables,table A 和 table B.

Table A:                         Table B:
Column A | Column B              Column A | Column B
Siemens  | 100                   SIE      | null
Siemens  | 101                   SIE      | null
Siemens  | 102                   SIE      | null
Siemens  | 103                   SIE      | null

我想用 Table A 的 B 列更新 Table B 的 B 列,但是我只想在 Table A 的 A 列和来自 Table A 的 A 列时执行此操作Table B 是 100% 匹配。现在什么都不会发生,因为 Table A 中的 A 列不等于 Table B 中的 A 列。

因此,为了解决这个问题,用户可以使用我称之为动作方案的东西来编辑列。此操作方案将在 table A 中将 'Siemens' 替换为 'SIE'。替换后,Table A 中的 A 列等于 Table B 中的 A 列。有了这个match 我现在可以使用 Table A 中 B 列的值更新 Table B 中的 B 列。完成此更新后,我想提交这些更改并回滚我在 Table A 列中所做的编辑=35=]A('Siemens'改成'SIE'要回滚)。

在我的代码中它看起来像这样:

try
{
    using (TransactionScope outerTransScope = new TransactionScope(TransactionScopeOption.RequiresNew))
    {
          // 1.Change Siemens into SIE Column A from Table A
              using (TransactionScope innerTransScope = new TransactionScope(TransactionScopeOption.RequiresNew))

          {
               // 2.Update Column B from Table B with the values of Column B from Table B, but only if Column A from Table A equals Column A from Table B. 

               // 3.Commit the update of Column B from Table B
               innerTransScope.Complete();
          }
     }
     // 4.Rollback the changes in Column A from Table A (So SIE becomes Siemens again).
}
catch (Exception)
{
// Log the exception
}

在嵌套事务中,没有事务层次结构。它总是只有一个事务。您只能使用 TransactionScopeOption.Required 创建交易的依赖关系,这样它将使用现有的可用交易并加入它。您正在为某个目的创建依赖关系。如果您不想要依赖性,那么首先完成初始事务处理它,然后创建新范围并完成它。

我可以按要求回答问题,但这只是个坏主意。您在这里尝试做的事情将 运行 变成许多问题,例如事务之间的隔离和事务之间的分布式死锁。 SQL 服务器无法解决分布式死锁。它们由 30 秒超时解决。

这是一个脆弱的方案。

找到一种不需要回滚任何东西的方法。例如,在 temp table 中创建临时数据并使用它。使用单个事务和单个连接。