我正在使用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没有达到死锁条件时,它工作正常,所以我认为这与从该错误中恢复有关。
有什么想法吗?