Как я могу получить фактический cursor.rowcount на .commit? - PullRequest
0 голосов
/ 14 июня 2011

Я использую MySQLdb в Python.

У меня есть обновление, которое может быть успешным или неуспешным: UPDATE table SET reserved_by = PID state = "unavailable" WHERE state = "available" AND id = REQUESTED_ROW_ID LIMIT 1;

Как вы можете сделать вывод, базы данных используют несколько процессов, и мне нужны процессы, чтобы иметь возможность безопасно получать строки для себя, без проблем гонки, вызывающих проблемы.

Моя теория (возможно, неверная) заключается в том, что только один процесс сможет успешно выполнить этот запрос (.rowcount = 1) - другие потерпят неудачу (.rowcount = 0) или получат другую строку (.rowcount = 1 ).

Проблема в том, что, похоже, все, что происходит через MySQLdb, происходит в виртуальном мире - .rowcount читает = 1, но вы не можете действительно знать , действительно ли что-то произошло, пока вы не выполните .commit ().

Мои вопросы:

  • В MySQL - это один атом UPDATE внутри себя? То есть, если одно и то же ОБНОВЛЕНИЕ выше (с разными значениями PID, но с одним и тем же REQUESTED_ROW_ID) было отправлено на один и тот же сервер MySQL «один раз», гарантирую ли я, что один из них будет успешным, а другой - неудачным?
  • Есть ли способ узнать, после вызова conn.commit (), было ли существенное изменение или нет? ** Могу ли я получить надежный .rowcount для фактической операции фиксации?
  • Отправляет ли операция .commit фактический запрос (нетронутые условия SET и WHERE) или просто выполняет SET на затронутых строках, независимо от предложений WHERE, которые их вдохновили?
  • Моя проблема аккуратно решена с помощью .autocommit?

1 Ответ

0 голосов
/ 14 июня 2011

Включите autocommit.

Операция commit просто «подтверждает» уже выполненные обновления. Альтернатива - rollback, которая "отменяет" любые уже сделанные обновления.

...