如何捕获pymssql死锁作为例外?

时间:2016-02-04 09:41:11

标签: python sql-server database-deadlocks pymssql

我们陷入僵局,失去了与我们的一些数据挖掘工作的联系。我们想要抓住Python pymssql模块因死锁而失败的问题。

DateTimeIterable dti = DateTimeIteratorFactory.createDateTimeIterable(RRULE, DTSTART, dateTimeZone, true);

我们尝试在try / except中包装我们的CURSOR.EXECUTE语句,但它不会触发。

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')

我们看到other examples在那些代码似乎正在陷入僵局的人身上,所以我们不确定为什么我们没有捕获。

如何解决这个僵局的任何建议?

当系统出现故障时,能够发出扩音器或其他警报来告诉我们,这将是非常棒的。

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

也许您需要捕获OperationalError。

exception pymssql.OperationalError

  

引发与数据库操作相关的错误,而不是   必须在程序员的控制下,例如意外   发生断开连接,找不到数据源名称,一个事务   无法处理,期间发生内存分配错误   处理等.DataError的子类。

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