2

我将 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 没有达到死锁条件时它工作正常,所以我认为这与从该错误中恢复有关。

有任何想法吗?

4

0 回答 0