这个sqltransaction已经完成;它不再可用。连接仍然打开 [英] This sqltransaction has completed; it is no longer usable. Connection still open

查看:116
本文介绍了这个sqltransaction已经完成;它不再可用。连接仍然打开的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

大家好,



我正在尝试测试两个sqlconnections。我故意在第二个sql命令文本上添加一些错误以强制它回滚所有内容,但是当它遇到第二个catch块中的TransHQ.Rollback()时出现错误。我知道僵尸交易的事情,但我的两个连接仍然是开放的。也许我错过了什么。

这是我的代码:

Hi everyone,

I'm having two sqlconnections that I'm trying to test. I purposely put some error on the second sql commandtext to force it to rollback everything, but I'm having an error when it hits the TransHQ.Rollback() in the second catch block. I knew about the "zombie transaction" thing, but all of my two connections are still open. Maybe I missed something.
This is my code:

Try
    sqloCnHQ.Open()
    TransHQ = sqloCnHQ.BeginTransaction()
    cmdHQ.Transaction = TransHQ
    cmdHQ.Connection = sqloCnHQ
    cmdHQ.CommandText = SqlHQ.ToString()
    cmdHQ.CommandTimeout = 0
    cmdHQ.ExecuteNonQuery()
    TransHQ.Commit()
Catch ex As Exception
    Application.DoEvents()
    TransHQ.Rollback()
    ErrorHandling("Sync Transactions " & cmdHQ.ToString)
    SyncMessageOPT += "Sync Transactions " + cmdHQ.ToString + Environment.NewLine
    sqloCnHQ.Dispose()
    Err.Clear()
    Exit Sub
End Try


Try
    sqloCnLocal.Open()
    TransLocal = sqloCnLocal.BeginTransaction()
    cmdLocal.Transaction = TransLocal
    cmdLocal.Connection = sqloCnLocal
    cmdLocal.CommandText = SqlLocal.ToString() + "xxx"
    cmdLocal.CommandTimeout = 0
    cmdLocal.ExecuteNonQuery()
    TransLocal.Commit()
Catch ex As Exception
    Application.DoEvents()
    TransHQ.Rollback()
    TransLocal.Rollback()
    ErrorHandling("Sync Transactions " & cmdLocal.ToString)
    SyncMessageOPT += "Sync Transactions " + cmdLocal.ToString + Environment.NewLine
    sqloCnHQ.Dispose()
    sqloCnLocal.Dispose()
    Err.Clear()
    Exit Sub
End Try

sqloCnHQ.Dispose()
sqloCnLocal.Dispose()





提前致谢!



Thanks in advance!

推荐答案





感谢您的想法。我设法做对了,但我不确定我做的是否有缺点。我只是在第二个ExecuteNonQuery之后放两个提交语句。

Hi,

Thanks for the idea. I manage to get it right, but I'm not sure if what I did will have a drawback.I simply put the two commit statements after the second ExecuteNonQuery.
sqloCnLocal.Open()
TransLocal = sqloCnLocal.BeginTransaction()
cmdLocal.Transaction = TransLocal
cmdLocal.Connection = sqloCnLocal
cmdLocal.CommandText = SqlLocal.ToString() + "xxx"
cmdLocal.CommandTimeout = 0
cmdLocal.ExecuteNonQuery()

TransHQ.Commit()
TransLocal.Commit()





因此,在整个执行完成之前,不要先提交。



感谢您的帮助!



So the idea is not to commit first until the whole execution finished.

Thanks for the great help!


这篇关于这个sqltransaction已经完成;它不再可用。连接仍然打开的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆