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 中创建临时数据并使用它。使用单个事务和单个连接。
我对下面显示的代码有疑问。
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 中创建临时数据并使用它。使用单个事务和单个连接。