【问题标题】:How to catch a pymssql deadlock as an exception?如何将 pymssql 死锁作为异常捕获?
【发布时间】:2016-02-04 09:41:10
【问题描述】:

我们的一些数据挖掘工作陷入僵局并失去联系。挑战是我们希望在 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')

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

 try:
    CURSOR.execute(query)
except (RuntimeError, TypeError, NameError):
    print "RuntimeError: {0}".format(RuntimeError)

我们在 SO 上看到 other examples 的人的代码似乎遇到了死锁,所以我们不确定为什么我们的代码没有解决。

有什么建议可以解决这个死锁吗?

当系统出现故障时,如果能够响起扩音器或其他警报让我们知道,那就太好了。

【问题讨论】:

    标签: python sql-server database-deadlocks pymssql


    【解决方案1】:

    我认为是:

    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)
    

    【讨论】:

      【解决方案2】:

      也许您需要捕获 OperationalError。

      exception pymssql.OperationalError

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

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

      【讨论】:

        猜你喜欢
        • 2018-07-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-29
        • 2014-11-24
        • 1970-01-01
        相关资源
        最近更新 更多