【问题标题】:SQL Transaction commit leaves connection in corrupt state (c#)SQL 事务提交使连接处于损坏状态(c#)
【发布时间】:2012-12-03 16:30:02
【问题描述】:

简短: 在调用 transaction.Commit() 之后,下一个操作会失败,就像事务没有提交一样。

更多详情: 我们有一个线程运行对数据库的写查询,其中一些被封装在一个事务中。 一段时间后运行较重的负载时,我们会遇到提交事务后的操作失败并显示错误指示事务正在进行中的情况,具体取决于提交后执行的操作,我们会收到以下错误之一:

下一个操作是'开始交易:

...连接不支持并行事务...

下一个操作是插入/更新/删除

ExecuteNonQuery 需要命令 当分配给命令的连接处于 待处理的本地事务。命令的事务属性 尚未初始化。

通过调试器检查 Sql Connection 对象表明它包含一个“sqlInnerTransaction”对象,其父对象设置为空。 我们确实知道对“提交”的调用成功完成,没有出现错误。
运行.net 4.0,SQL Server 2008 R2 SP2

【问题讨论】:

  • 你能添加一些代码吗?事务是如何开始和提交的?是否有可能出现异常导致错过提交?
  • 我们正在使用 sqlCon.BeginStransaction() 和 transaction.Commit() 我们正在使用日志记录和附加调试器进行监控,要捕获的第一个异常是上面写的那个..
  • 您可能应该在每次(未)成功的 Commit() 之后调用 Close() 或 Dispose()。使用using 语句最简单。
  • @HenkHolterman 我们在每次调用提交后调用 Dispose()

标签: c# sql sql-server-2008 database-connection clr4.0


【解决方案1】:

查看此消息:

连接不支持并行事务

不知道你是否在多个线程中使用单个连接对象?

连接不是线程安全的。您应该只在创建它们的线程中使用它们。

【讨论】:

  • @adnomar,我们实际上发现了另一个线程错误地访问此连接的情况,它已同步但在修复它之后我们仍然看不到错误! occam 的剃刀又来了,谢谢!
猜你喜欢
  • 1970-01-01
  • 2012-04-04
  • 1970-01-01
  • 1970-01-01
  • 2018-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多