MySqlDB Python не получает обновленную строку - PullRequest
11 голосов
/ 24 октября 2009

У меня есть скрипт, который ожидает обновления какой-либо строки в БД:

con = MySQLdb.connect(server, user, pwd, db)

Когда сценарий запускается, значение строки равно "running", и оно ожидает, пока значение не станет "finished"

while(True):
    sql = '''select value from table where some_condition'''
    cur = self.getCursor()
    cur.execute(sql)
    r = cur.fetchone()
    cur.close()
    res = r['value']
    if res == 'finished':
        break
    print res
    time.sleep(5)

Когда я запускаю этот скрипт, он зависает навсегда. Даже если я вижу, что значение строки изменилось на "finished", когда я запрашиваю таблицу, распечатка сценария по-прежнему "running".

Есть какие-то настройки, которые я не установил?

РЕДАКТИРОВАТЬ: скрипт Python запрашивает только таблицу. Обновление таблицы выполняется веб-приложением tomcat с использованием JDBC, установленного для автоматической фиксации.

Ответы [ 2 ]

17 голосов
/ 24 октября 2009

Это таблица InnoDB, верно? InnoDB - это транзакционный механизм хранения. Установка true для autocommit, вероятно, исправит это поведение.

conn.autocommit(True)

Кроме того, вы можете изменить уровень изоляции транзакции. Вы можете прочитать больше об этом здесь: http://dev.mysql.com/doc/refman/5.0/en/set-transaction.html

Причина такого поведения заключается в том, что в одной транзакции операции чтения должны быть согласованными. Все непротиворечивые чтения в одной и той же транзакции считывают снимок, созданный при первом чтении. Даже если ваш скрипт читает только таблицу, это тоже считается транзакцией. Это поведение по умолчанию в InnoDB, и вам нужно изменить это или запустить conn.commit () после каждого чтения.

Эта страница объясняет это более подробно: http://dev.mysql.com/doc/refman/5.0/en/innodb-consistent-read.html

3 голосов
/ 06 октября 2011

Я обошел это, запустив

c.execute("""set session transaction isolation level READ COMMITTED""")

в начале моей сессии чтения. Обновления из других тем уже приходят.

В моем случае я долго держал соединения открытыми (внутри mod_python), поэтому обновления других процессов вообще не были видны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...