MariaDB / PDO / PHP 1020 Ошибка («Запись изменилась с момента последнего чтения в таблице»)Php

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 MariaDB / PDO / PHP 1020 Ошибка («Запись изменилась с момента последнего чтения в таблице»)

Сообщение Anonymous »

Как правильно справиться с ошибками 1020 в рамках транзакции в MariaDB? Трудно поверить, что «запись изменилась с момента последнего чтения в таблице», потому что провал SQL -запрос предназначен только для записей, используемых одним пользователем (посетителем): < /p>
DELETE FROM vbshoppingcart where visitor_id = :visitor_id AND businessunitID = :businessunitID
< /code>
В любом случае, когда возникает эта ошибка, я стараюсь поймать ее и снова запустить запрос, потому что на самом деле это должен быть временный сбой: < /p>
$this->dbh = new PDO($dsn, $this->user, $this->pass, $options);
$this->dbh->beginTransaction();

// other queries within the same transaction will precede the query in question

$retry_attempts = 3;
$retry_wait_microseconds = 100000; // 100ms

while ($retry_attempts > 0) {
$this->stmt = $this->dbh->prepare($this->query);
$this->bindparams();

try {

$returnvalue = $this->stmt->execute();
$this->clearBindvalues();

return $returnvalue;

} catch (\PDOException $e) {
$error_code = $e->getCode();
$error_message = $e->getMessage();

if ($error_code === 'HY000' && strpos($error_message, '1020') !== false) {
// Retry in case of 1020
error_log("Retry because of error 1020 – remaining: $retry_attempts.");

usleep($retry_wait_microseconds);
$retry_attempts--;
continue;
}

// If no possibility that the query can be successfully executed clear the bind values in order to have the object ready for additional DB queries

$this->clearBindvalues();

}

throw new \Exception('PDO error occurred. Could not perform desired database interaction.');

}

// other queries within the same transaction will follow the query in question

try {

// At the end the transaction will be committed:
$result = $this->dbh->commit();

} catch (\PDOException $e) {

error_log("Commit failed: " . $e->getMessage());
$this->dbh->rollBack();

throw new \Exception("Transaction commit failed: " . $e->getMessage());
}
< /code>
Я запускаю это в транзакции (как показано в коде) с другими запросами до и после запроса, который иногда вызывает проблемы. Если ошибка 1020 выбрана, всегда будет успешно выполнена первая попытка, и сценарий продолжается. В конце транзакция будет успешно совершена (в соответствии с журналами), но на самом деле записи не будут записаны на MariaDB.

Подробнее здесь: https://stackoverflow.com/questions/797 ... d-in-table
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»