Как именно транзакции с PHP PDO работают с параллелизмом?

Я создаю webapp, где они будут взаимодействовать друг с другом несколькими пользователями, а также принимать / принимать решения о / изменении общих данных.

Я читал, что транзакции являются атомарными, и это то, что мне нужно. Однако я не уверен, как это работает с PHP PDO::beginTransaction()

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

Почти во всех примерах, которые я видел, запросы последовательно используются (например, примеры операций PHP + MySQL ). Многое из того, что я делаю, требует

  • запрос и выборка
  • проверяя эти данные и действуя на них, как часть одной и той же транзакции

  1. Будет ли транзакция по-прежнему работать атомарно, если есть PHP-код между запросами?
  2. Я знаю, что вы должны подготовить свои заявления за пределами транзакции, но нормально ли готовить ее внутри? В принципе, меня беспокоит активность PHP, разрушающая атомарность транзакции.

Вот пример (это не требует проверки предыдущего значения). У меня есть очень простая система входящих сообщений, которая хранит почту как сериализованный массив (если у кого-то есть лучшая рекомендация, пожалуйста, дайте мне знать). Поэтому я запрашиваю его, добавляю новое сообщение и сохраняю его. Будет ли он работать, как ожидалось?

 $getMail = $con->prepare('SELECT messages FROM inboxes WHERE id=?'); $storeMail = $con->prepare('UPDATE inboxes SET messages=? WHERE id=?'); $con->beginTransaction(); $getMail->execute(array($recipientID)); $result = $getMail->fetch(); $result = unserialize($result[0]); $result[] = $msg; $storeMail->execute(array(serialize($result), $recipientID)); $con->commit(); 

Solutions Collecting From Web of "Как именно транзакции с PHP PDO работают с параллелизмом?"

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

PHP-код между запросами не будет нарушать атомарность, и не имеет значения, где вы готовите свои заявления.