PDO и множественные запросы / проблемы параллелизма - PullRequest
1 голос
/ 22 июня 2011

В PHP я использую PDO для взаимодействия с базами данных.Одна процедура, которая обычно имеет место, состоит из нескольких запросов (несколько SELECT и UPDATE).Это работает большую часть времени, но иногда данные оказываются поврежденными, когда два (или более) экземпляра процедуры выполняются одновременно.

Как лучше всего обойти эту проблему?В идеале я хотел бы получить решение, которое работает с большинством драйверов PDO.

1 Ответ

5 голосов
/ 22 июня 2011

Предполагая, что ваша база данных поддерживает транзакции (mysql с InnoDB, Postgres и т. Д.), Тогда простое завершение рассматриваемой операции в транзакции решит проблему. Если один экземпляр сценария находится в середине транзакции, когда второй сценарий пытается его запустить, то изменения базы данных второго сценария будут поставлены в очередь и не будут предприниматься до тех пор, пока первая транзакция не завершится. Это означает, что база данных всегда будет в допустимом состоянии, если логика запуска и принятия транзакции реализована правильно.

if ($inTransaction = $pdo -> beginTransaction ())
{
    // Do your selects and updates here. Try to keep this section as short as possible though, as you don't want to keep other pending transactions waiting
    if ($condition_for_success_met)
    {
        $pdo -> commit ();
    }
    else
    {
        $pdo -> rollback ();
    }
}
else
{
    // Couldn't start a transaction. Handle error here
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...