【发布时间】:2011-07-30 13:22:28
【问题描述】:
我们的一个生产服务器正面临一种情况。 我们有一个特殊的存储过程,它对数据库中最大的表之一执行插入操作(它有几百万行)。该表是数据库中最繁忙的表,有许多依赖于它的操作。
最近我们在一个特定的生产服务器上遇到了一个问题。
我们在一个事务中执行插入 SP 以及其他一些更新 SP,并且我们经常面临插入 SP 的“长时间运行事务”问题。当我们遇到这个问题时,我们会在插入到表中的数据中发现一个典型的行为。 datetime 列值被插入为“null”。它发生在所有行的某些时间和一些行的某些时间。日期时间值是从应用程序传递的。 但是在插入操作之前和之后执行的其他更新操作运行良好。
我们在测试环境(不在生产服务器中)运行了 sql profiler trace,但发现 datetime 值每次都正确传递。
当我们在生产中遇到问题时,我们观察到:
- @@trancount 等于“0”,但 DBCC OPENTRAN 显示 特定的公开交易。
- Last Wait 类型的值为“NETWORKIO”。
- 等待类型为“0x0000”。
- 状态为“睡眠”。
- 隔离级别已读取未提交。
所以我们关心的是
- 为什么仅在这种特殊情况下将日期时间插入为“NULL”?
- 如何避免这种情况以及长时间运行的事务?
- 在一台特定服务器上出现这种情况的原因可能是什么?
提前感谢您的帮助,
阿比吉特
【问题讨论】:
-
长时间或短时间运行的事务不会导致这种情况。出现问题是因为您的过程中存在错误,包括您执行脏读的事实。
-
我同意 Remus 的观点,尤其是在“脏读物”方面。关于为什么它发生在一台特定的服务器上,也许它是最繁忙的?
-
您能否发布一个经过清理的程序代码示例,以便我们对其进行调试?
-
我猜您不小心将 datetime 输入变量设置为 NULL,这就是它被插入为 NULL 的原因。这可能是由 Remus 所讨论的脏读相关问题触发的。
标签: sql sql-server-2000