Должен ли я выполнить rollBack () перед выходом ()? - PullRequest
2 голосов
/ 22 апреля 2020

У меня есть такой код

try {
  $pdo->beginTransaction();
  $stmt = $pdo->prepare($query1);
  $stmt->execute($x);
} catch (Exception $e) {
  $pdo->rollBack();
  throw->$e;
}

if (condition) {
  exit();
}

$x['column1'] = 'string1';
$x['column2'] = 'string2';
$x['column3'] = 'string3';

try {
  $stmt = $pdo->prepare($query2);
  $stmt->execute($x);
  $pdo->commit();
} catch (Exception $e) {
  $pdo->rollBack();
  throw->$e;
}

Если if condition выполнен успешно и код сделал exit()

Все ли, что связано с $pdo, тоже безопасно или я добавить до exit() a $pdo->rollBack();?

Ответы [ 2 ]

4 голосов
/ 22 апреля 2020

Технически это не так.

PHP закроет соединение с базой данных при выходе.
База данных откатит все активные транзакции при закрытии.

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

Кроме того, использование exit само по себе является плохой практикой, а транзакция в десять раз больше.

Но если вам это действительно нужно (на самом деле это не так), тогда сделайте что-то вроде

try {
  $pdo->beginTransaction();
  $stmt = $pdo->prepare($query1);
  $stmt->execute($x);

if (condition) {
  throw new Exception("Stopped on condition");
}

$x['column1'] = 'string1';
$x['column2'] = 'string2';
$x['column3'] = 'string3';

  $stmt = $pdo->prepare($query2);
  $stmt->execute($x);
  $pdo->commit();
} catch (Throwable $e) {
  $pdo->rollBack();
  throw->$e;
}
2 голосов
/ 22 апреля 2020

Из документов:

Когда скрипт завершится или когда соединение будет закрыто, если у вас есть ожидающая транзакция, PDO автоматически откатит ее.

https://www.php.net/manual/en/pdo.transactions.php

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...