【发布时间】:2011-12-20 06:35:31
【问题描述】:
我看到一些奇怪的行为,对于完全不相关的查询已经发生了不止一次。
Sql 查询中的 COMMIT TRANSACTION 语句似乎被忽略了,尽管没有发生错误,在表上留下锁,直到进程被终止。
这是一个例子:
BEGIN TRY
BEGIN TRANSACTION
UPDATE Elements.ProductDeparture
SET DurationDays = 5,
FinishDate = DATEADD(day, 4, DepartureDate)
WHERE DepartureCode LIKE 'PPAF%'
AND ProductID = 2359
COMMIT TRANSACTION
END TRY
BEGIN CATCH
PRINT 'Error: ' + ERROR_MESSAGE()
ROLLBACK
END CATCH
查询没有出现错误(如果您在没有事务的情况下运行它,它会很好地完成)。该行为是可重现的(即,每次运行上述查询时都会发生,而不仅仅是间歇性地发生)。
这已经发生了两次,对于在事务中运行的完全不相关的查询。
这是奇怪的一点。我们已经在我们的开发环境和测试环境中运行它,没有任何问题。在生产环境中运行它会导致进程无法完成,并在表上保持锁定,直到进程被终止。它们都是 SQL Server 2005 环境。
是否有任何可能导致这种奇怪行为的 SQL Server 数据库设置?到目前为止,大约有 5 位开发人员看过它,但从未见过类似的东西。
【问题讨论】:
-
死锁?如果我没记错的话,1 个进程并不等同于一个 SQL 语句——一个进程可以被多个连接共享。
标签: sql-server sql-server-2005