Sql server 需要一个赢得';无法使用异常回滚

Sql server 需要一个赢得';无法使用异常回滚,sql-server,vb.net,exception,transactionscope,Sql Server,Vb.net,Exception,Transactionscope,我有一些命令,比如Insert、Update、Create等等,我想在SQL实例的某个数据库中运行它们。 为此,我使用事务作用域,并且我希望在所有数据库上运行所有命令,即使发生了一些错误。 如果发生了错误,我希望在不提交正确命令的情况下向用户显示所有错误。 但在事务中,当它到达第一个错误时,它将回滚,并且我无法继续运行其他命令。 我的命令如下: using Trans as new TransactionScope con.open() for i as integer = 0 to n

我有一些命令,比如Insert、Update、Create等等,我想在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实际上跟踪发生的任何错误。如果事务中发生任何错误,SQL Server将声明该事务有错误,并且不允许在同一事务下发送任何进一步的推荐。因此,即使SQL错误由应用程序中的try/catch块处理,事务在SQL Server上已经失败,因此在发送下一个命令时也会失败

唯一可行的选择是基本上运行事务中的每个命令,然后回滚它们,不管它们是否失败和成功。如果所有这些都成功了,那么您可以在一个大事务中运行它们并提交它们。但这只有在他们完全独立的情况下才能起作用


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

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

唯一可行的选择是基本上运行事务中的每个命令,然后回滚它们,不管它们是否失败和成功。如果所有这些都成功了,那么您可以在一个大事务中运行它们并提交它们。但这只有在他们完全独立的情况下才能起作用


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

将异常处理移到SQL中,请参阅。决定哪些异常可以安全处理,哪些必须进一步提出,哪些可以安全忽略。绝大多数例外情况不容忽视。即使是那些可能被忽略的,绝大多数都必须考虑整个事务上下文,以便它们不留下数据不一致。请注意,并非所有异常都可以通过回滚到保存点来处理,某些异常将在已销毁事务后引发(例如死锁)


总的来说,我会将您的需求归类为极差的判断想法。

将异常处理移到SQL中,请参阅。决定哪些异常可以安全处理,哪些必须进一步提出,哪些可以安全忽略。绝大多数例外情况不容忽视。即使是那些可能被忽略的,绝大多数都必须考虑整个事务上下文,以便它们不留下数据不一致。请注意,并非所有异常都可以通过回滚到保存点来处理,某些异常将在已销毁事务后引发(例如死锁)


总的来说,我会将您的需求归类为极差的判断想法。

谢谢,这是一个好观点,但我认为它不适合分布式事务。谢谢,这是一个好观点,但我认为它不适合分布式事务。