如何将pymssql死锁捕获为异常?

4
我们进行一些数据挖掘工作时遇到了死锁并失去了连接。我们的挑战是想要捕获 Python pymssql 模块由于死锁而失败的情况。
File "pymssql.pyx", line 465, in pymssql.Cursor.execute (pymssql.c:6572)
OperationalError: (1205, 'Transaction (Process ID 113) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.DB-Lib error message 20018, severity 13:\nGeneral SQL Server error: Check messages from the SQL Server\n')

我们尝试用try/except包装我们的CURSOR.EXECUTE语句,但它没有触发。
 try:
    CURSOR.execute(query)
except (RuntimeError, TypeError, NameError):
    print "RuntimeError: {0}".format(RuntimeError)

我们在Stack Overflow上看到其他示例,这些示例中的人的代码似乎能够捕获死锁,因此我们不确定为什么我们的代码没有捕获。 有什么建议可以捕获这个死锁吗?
当系统失败时,如果能发出牛角或其他警报来通知我们,那将是非常好的。
2个回答

0
也许你需要捕获 OperationalError。

exception pymssql.OperationalError

用于与数据库操作相关的错误,不一定在程序员控制下,例如出现意外断开连接,找不到数据源名称,不能处理事务,处理期间发生内存分配错误等。是 DatabaseError 的一个子类。

try:
    CURSOR.execute(query)
except OperationalError as e:
    print "OperationalError : {0}".format(e)

0

我认为是:

try:
   CURSOR.execute(query)
except pymssql.InterfaceError as e:
   print "SQL Interface Error: "+str(e)

但我仍在等待死锁情况发生,所以我不确定 :) 无论如何,以下将处理所有pymssql错误,包括1205死锁:

try:
   CURSOR.execute(query)
except pymssql.Error as e:
   print "SQL Error: "+str(e)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接