Как работает транзакция MySQL и когда выполнять откат? - PullRequest
0 голосов
/ 13 марта 2019

Интересно, как работает транзакция? Вопрос: нужно ли откатываться, если возникает какая-либо ошибка / исключение , где исключение будет выдано и никогда не достигнет вызова 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.

...