Интересно, как работает транзакция? Вопрос: нужно ли откатываться, если возникает какая-либо ошибка / исключение , где исключение будет выдано и никогда не достигнет вызова commit () ?Если так, то почему и как?и что делает откат точно?
учитывает следующий PHP-код (некоторый Java-код делает подобные вещи вот так):
public function deleteAll():void{
$stmt = $this->con->prepare(
'DELETE FROM dd WHERE 1'
);
$this->con->begin_transaction();
if(!$stmt->execute()){
throw new Exception($stmt->error);
}
$this->con->commit();
}
public function insert(array $list):void{
$stmt = $this->con->prepare(
'INSERT INTO dd(cc) VALUES(?)'
);
$stmt->bind_param('s', $v);
$this->con->begin_transaction();
foreach($list as $v){
if(!$stmt->execute()){
throw new Exception($stmt->error);
}
}
$this->con->commit();
}
Примечание: $ this-> con - это mysqliобъект соединения (не использует PDO, хотя и отличается, но PDO и mysqli будут делать то же самое, что и выше).база данных - MySQL, таблица с использованием механизма InnoDB.
Некоторые люди показывают, что они перехватывают исключение и выполняют откат.Но я этого не делал, поскольку commit () никогда не выполняется, если выбрасывается Exception.Тогда это заставляет меня задуматься, зачем вообще нужен откат.
Я предполагаю, что если нужно выполнить несколько запросов одновременно, как показано ниже:
public function replaceAllWith(array $list):void{
$this->con->begin_transaction();
try{
//do both previous queries at once
$this->deleteAll();
$this->insert($list);
$this->con->commit();
}catch(Exception $e){
//error
$this->con->rollback();
}
}
, но тогда он все равно не можетоткат, потому что каждый метод / функция выполняется и фиксируется другим методом и разными транзакциями. Второй вопрос: выполнять ли каждую транзакцию в каждом вызове метода или вызывать транзакцию только в функции 'boss / parent' , которая только вызывает и координирует 'subordinate / helper' функции для работы?
Не уверен, что я задаю правильные вопросы.Транзакция с базой данных сбивает с толку, многие онлайн-ресурсы показывают только процедурный процесс (только фиксация или немедленный откат, который не имеет различий с обычным прямым запросом) без использования концепций ОО.Пожалуйста, любые плюсы руководство и дать несколько советов.TQ.