Как получить это предупреждающее сообщение, когда запрос блокируется?

Когда я делаю запрос с помощью isql, я получаю следующее сообщение и блоки запроса.

Журнал транзакций в базе данных foo почти заполнен. Ваша транзакция приостановлена ​​до тех пор, пока в журнале не освободится место.

Когда я делаю то же самое из Python:

cursor.execute(sql)

Запрос блокируется, но я хотел бы увидеть это сообщение.

Я старался:

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

Я использую:

  • Python-sybase-0.40pre1
  • Адаптивный сервер Enterprise/15.5/EBF 18164

РЕДАКТИРОВАТЬ: Вопрос в том, «Как мне зафиксировать это предупреждающее сообщение в программе python?»


person Eddy Pronk    schedule 23.09.2011    source источник
comment
Какую базу данных вы используете? Какая питон библиотека?   -  person Chris Lacasse    schedule 23.09.2011
comment
Я отредактировал вопрос, чтобы добавить эти детали.   -  person Eddy Pronk    schedule 23.09.2011
comment
Я недостаточно знаю об этой библиотеке, чтобы предложить полноценный ответ, но можно ли где-то указать тайм-аут? В качестве альтернативы, вы можете запустить запрос в отдельном потоке и заставить другой поток прервать запрос через определенное время, если запрос не вернулся?   -  person    schedule 04.10.2011


Ответы (3)


Хороший вопрос, и я не уверен, что смогу полностью на него ответить. Вот несколько идей.

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, мы увидим (как вы указываете), что он блокирует. Мы ответим на ваш вопрос. Вы ничего не получите обратно, так как это блокирует это. Так как же это исправить - написать неблокирующий метод excute ;) Несколько советов есть в examples/timeout.py. Видимо, кто-то еще столкнулся с этим, но на самом деле не исправил.

Я знаю, что это, вероятно, не помогло, но я потратил 15 минут на поиски - я должен хотя бы рассказать вам, что я нашел.. Вы могли бы подумать, что execute даст вам немного result -- Подождите, каково значение результата в строке 707 ??

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

Если статус! = CS_SUCCEED (который, как я предполагаю, в вашем случае равен True), можете ли вы просто увидеть, чему равен «результат»? Интересно, они просто не смогли поднять результат в виде исключения?

person rh0dium    schedule 09.11.2011

Ваш запрос может быть большим, что приводит к переполнению журнала транзакций (например, вы вставляете большие двоичные файлы). Или вы, возможно, недостаточно часто усекаете свои журналы транзакций, если это возможно.

Во время выполнения вы захотите иметь оператор исключения, который перехватывает ошибку исключения.

См. документацию по Sybase Python.

person James Oltmans    schedule 03.10.2011
comment
Вызов блокируется и не вызывает исключения. - person Eddy Pronk; 04.10.2011
comment
Я не говорю о том, сколько строк было обновлено, я имел в виду, что содержимое запроса может быть большим. Как я уже сказал, если вы вставляете много двоичных данных в эту 1 строку. - person James Oltmans; 05.10.2011

Причина очевидна, журнал транзакций заполнен, вы можете проверить блокирующие запросы в таблице sybase MDA monSysStatement.

person Gopal Sanodiya    schedule 27.09.2011
comment
Спасибо, но это не отвечает на вопрос, как зафиксировать это предупреждающее сообщение в программе python, чтобы пользователь мог понять, почему вызов запроса не возвращается. - person Eddy Pronk; 28.09.2011