Я немного запутался в транзакциях и заблокировал таблицы, чтобы обеспечить целостность базы данных и убедиться, что SELECT и UPDATE остаются в синхронизации, и никакое другое соединение не мешает ей. Мне нужно:
SELECT * FROM table WHERE (...) LIMIT 1
if (condition passes) {
// Update row I got from the select
UPDATE table SET column = "value" WHERE (...)
... other logic (including INSERT some data) ...
}
Мне нужно убедиться, что никакие другие запросы не будут мешать и выполнять те же SELECT
(чтение "старого значения" до того, как это соединение завершит обновление строки.
Я знаю, что могу по умолчанию использовать LOCK TABLES table
, чтобы убедиться, что только одно соединение делает это за раз и разблокирует его, когда я закончил, но это похоже на перебор. Повлияет ли это на транзакцию на одно и то же (если никакое другое соединение не пытается выполнить тот же процесс, пока другой все еще обрабатывает)? Или лучше будет SELECT ... FOR UPDATE
или SELECT ... LOCK IN SHARE MODE
?