如何在查询阻塞时捕获此警告消息?

5 投票
3 回答
745 浏览
提问于 2025-04-17 02:53

当我用isql进行查询时,出现了以下信息,查询被阻塞了。

数据库foo的事务日志快满了。你的事务正在被暂停,直到日志中有空间可用。

当我在Python中做同样的事情时:

cursor.execute(sql)

查询被阻塞了,但我希望能看到这个信息。

我尝试了:

Sybase.set_debug(sys.stderr)
connection.debug = 1

我使用的是:

  • python-sybase-0.40pre1
  • Adaptive Server Enterprise/15.5/EBF 18164

编辑:我的问题是,“我怎么才能在Python程序中捕获到这个警告信息?”

3 个回答

-2

原因很简单,事务日志满了。你可以在Sybase的MDA表monSysStatement中查看哪些查询导致了阻塞。在这里,你可以检查哪些SQL语句消耗了大量的输入输出(IO)、时间,以及影响了多少行数据等等。

-1

你的查询可能很大,导致事务日志溢出(比如你在插入很大的二进制文件)。或者,如果有这个选项的话,你可能没有经常清理你的事务日志。

在运行时,你需要有一个异常处理语句,用来捕捉错误。

可以查看一下Sybase Python 文档

1

这是个好问题,不过我不确定我能否完全回答。这里有一些想法。

Sybase.py使用了日志记录功能。确保你在使用它。为了“输出”日志,我会这样做:

import logging
logging.basicConfig(level = logging.INFO,
                    format = "%(asctime)s %(levelname)s [%(filename)s] (%(name)s) %(message)s",
                    datefmt = "%H:%M:%S", stream = sys.stdout)
log = logging.getLogger('sybase')
log.setLevel(logging.DEBUG)

而且显然(我不明白为什么)要让这个在Sybase.py中工作,你需要设置一个全局的 DEBUG=True(见第38行)

但是如果我们看看 def execute,我们可以看到(正如你指出的)它是阻塞的。这就有点回答了你的问题。你不会得到任何返回,因为它在阻塞着你。那么怎么解决这个问题呢?写一个非阻塞的执行方法;)在examples/timeout.py中有一些提示。显然其他人也遇到过这个问题,但并没有真正解决。

我知道这可能没有太大帮助,但我花了15分钟查找,我至少应该告诉你我发现了什么……你会想 execute 应该给你一些 result ——等等,707行中的result值是什么??

                while 1:
                    status, result = self._cmd.ct_results()
                    if status != CS_SUCCEED:
                        break

如果状态不等于 CS_SUCCEED(我假设在你的情况下是对的),你能简单地看看“result”等于多少吗?我在想他们是不是只是没有把结果抛出作为异常?

撰写回答