Я использую 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?