【问题标题】:Need For a TransactionScope Which Won't Rollback With An Exception需要一个不会因异常而回滚的 TransactionScope
【发布时间】:2013-01-21 08:24:04
【问题描述】:

我有一些命令,如插入、更新、创建等,我想在 SQL 实例的某个数据库中运行它们。 我为此使用事务范围,即使发生一些错误,我也想在所有数据库上运行所有命令。 如果发生了一些错误,我想在不提交正确命令的情况下向用户显示所有错误。 但是在事务中,当它遇到第一个错误时,它将被回滚,我无法继续运行其他命令。 我的命令是这样的:

using Trans as new TransactionScope

con.open()

for i as integer = 0 to n

Try
    com.commandtext = coms(i)
    com.executenonquery()

catch ex as exception
    errorCollection.add(ex.message) 
    continue for

end try

next

end using

【问题讨论】:

    标签: sql-server vb.net exception transactionscope


    【解决方案1】:

    事务的工作方式是 SQL Server 实际上跟踪发生的任何错误。如果事务中发生任何错误,SQL Server 将声明事务错误并且不允许在同一事务下发送任何进一步的命令。因此,即使 SQL 错误由应用程序中的 try/catch 块处理,事务在 SQL Server 上已经失败,因此在您发送下一条命令时将失败。

    唯一可行的选择是基本上在事务中运行每个命令,然后回滚它们,无论它们是失败还是成功。如果一切都成功,那么您可以在一个大事务中运行它们并提交。不过,这只有在它们完全独立时才有效。

    您最好的选择可能是解决它,基本上接受您可能只会遇到第一个错误。

    【讨论】:

      【解决方案2】:

      将异常处理移到 SQL 中,请参阅Exception Handling and Nested Transactions。确定可以安全处理哪些异常,必须进一步提出哪些异常以及可以安全忽略哪些异常。绝大多数异常不能被忽略。即使是那些可能被忽略的内容,绝大多数人也必须考虑整个事务上下文,以免数据不一致。请注意,并非所有异常都可以通过回滚到保存点来处理,某些异常将在已经销毁事务之后引发(例如死锁)。

      总体而言,我会将您的要求归类为极差的判断想法

      【讨论】:

      • 谢谢,这是一个好点,但我认为它不适合分布式事务。
      猜你喜欢
      • 1970-01-01
      • 2021-08-10
      • 1970-01-01
      • 1970-01-01
      • 2012-05-03
      • 1970-01-01
      • 2010-12-30
      • 2018-01-11
      • 2020-04-04
      相关资源
      最近更新 更多