Как правильно справиться с ошибками 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
MariaDB / PDO / PHP 1020 Ошибка («Запись изменилась с момента последнего чтения в таблице») ⇐ Php
Кемеровские программисты php общаются здесь
1758096209
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.
Подробнее здесь: [url]https://stackoverflow.com/questions/79767034/mariadb-pdo-php-1020-error-record-has-changed-since-last-read-in-table[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия