Ros*_*sco 8 .net sql-server transactions
我正在使用C#将发票的平面文件导入数据库.如果遇到问题,我正在使用TransactionScope回滚整个操作.
这是一个棘手的输入文件,因为一行不必等于一个记录.它还包括链接记录.发票将包含标题行,行项目,然后是总行.有些发票需要被跳过,但我可能不知道它需要被跳过,直到我达到总线.
一种策略是将标题,行项和总行存储在内存中,并在达到总行时保存所有内容.我现在正在追求这一点.
但是,我想知道它是否可以以不同的方式完成.在发票周围创建"嵌套"事务,插入标题行和行项目,然后在达到总行时更新发票.如果确定需要跳过发票,则此"嵌套"事务将回滚,但整个事务将继续.
这是可行的,实用的,你会如何设置?
Aar*_*ght 37
TransactionScopeSQL Server和SQL Server 都不支持嵌套事务.
您可以嵌套TransactionScope实例,但只具有嵌套事务的外观.实际上,有一种叫做"环境"的交易,一次只能有一种.环境事务的哪个事务取决于您TransactionScopeOption在创建范围时使用的内容.
要更详细地解释,请考虑以下事项:
using (var outer = new TransactionScope())
{
DoOuterWork();
using (var inner1 = new TransactionScope(TransactionScopeOption.Suppress))
{
DoWork1();
inner1.Complete();
}
using (var inner2 = new TransactionScope(TransactionScopeOption.RequiresNew))
{
DoWork2();
inner2.Complete();
}
using (var inner3 = new TransactionScope(TransactionScopeOption.Required))
{
DoWork3();
inner3.Complete();
}
outer.Complete();
}
Run Code Online (Sandbox Code Playgroud)
以下是每个内部范围的情况:
inner1在隐式事务中执行,独立于outer.发生的任何事情都DoWork1不会保证是原子的.如果在中途失败,您将获得不一致的数据.无论发生什么事情,在这里发生的任何工作总是被提交outer.
inner2在新的交易中执行,独立于outer.这是一个不同的事务,outer但它不是嵌套的.如果它失败了,那么在outer(DoOuterWork())和任何其他作用域中发生的工作仍然可以提交,但这就是问题:如果它完成了,那么回滚整个outer事务将不会回滚内部完成的工作inner2. 这就是它没有真正嵌套的原因.此外,inner2将无法访问被锁定的任何行outer,因此如果您不小心,最终可能会遇到死锁.
inner3在与... 相同的交易中执行outer.这是默认行为.如果DoWork3()失败并且inner3永远不会完成,则outer回滚整个事务.同样,如果inner3成功完成但outer回滚,则DoWork3()还会回滚所有已完成的工作.
所以你可以希望看到这些选项都没有实际嵌套,并且不会给你你想要的东西.该Required选项近似于嵌套事务,但不允许您在事务内独立提交或回滚特定工作单元.
您可以在SQL Server中获得真正嵌套事务的最接近的事情是将SAVE TRAN语句与一些TRY/CATCH块结合使用.如果您可以将逻辑放在一个或多个存储过程中,这将是一个不错的选择.
否则,根据Oded的建议,您需要为每张发票使用单独的交易.
这是通过事务保存点来完成的。它通常看起来像这样:
BEGIN TRANSACTION
for each invoice
SAVE TRANSACTION InvoiceStarted
BEGIN TRY
Save header
Save line 1
Save line 2
Save Total
END TRY
BEGIN CATCH
ROLLBACK TO Invoicestarted
Log Failed Invoice
END CATCH
end for
COMMIT
Run Code Online (Sandbox Code Playgroud)
我使用了基于 Transact-SQL 的伪代码,这并非偶然。保存点是一个数据库概念,.Net 事务不支持它们。您可以直接使用 SqlTransaction 并利用SqlTransaction.Save,也可以使用按照异常安全模板建模的 T-SQL 存储过程。在这种情况下,我建议您避免使用 .Net 事务(即 TransactionScope)。
| 归档时间: |
|
| 查看次数: |
10206 次 |
| 最近记录: |