我将 SQL Server 与 pymssql 一起使用,发现有时会选择一个特别复杂的 SELECT 查询作为死锁牺牲品。所以我把它包裹在一个while循环中,如果发生这种情况,我会重试事务,大致如下:
while True:
try:
cursor.execute('SELECT .......')
count_row = cursor.fetchone();
break
except Exception, tec:
print "Got error: %s" % (tec)
time.sleep(1)
cursor.execute('UPDATE .........')
self.conn.commit()
它似乎工作 - 如果 SELECT 遇到死锁,那么它将暂停一秒钟,再次重试并获得正确的答案。然而,每次发生以下 UPDATE 语句总是失败:
pymssql.OperationalError: Cannot commit transaction: (3902, 'The COMMIT TRANSACTION request has no corresponding BEGIN TRANSACTION.DB-Lib error message 3902, severity 16:\nGeneral SQL Server error: Check messages from the SQL Server\n')
UPDATE 语句不在 while 循环中,所以我不知道它为什么会失败。当 SELECT 没有达到死锁条件时它工作正常,所以我认为这与从该错误中恢复有关。
有任何想法吗?