MySQL Transaction + PHP проблема в Mysql - PullRequest
1 голос
/ 25 января 2011

У меня есть код, который использовался в приложении, где у меня возникла проблема с откатом. Даже если I 's2' возвращает ложный откат не происходит, то есть таблица 'products' отбрасывается. Может кто-нибудь объяснить, почему это не работает или как я должен изменить это. Примечание: таблицы из движка Innodb. Я использую mysql 5.0+

    mysql_query('SET AUTOCOMMIT=0;');
    mysql_query('START TRANSACTION;');
    $sql = 'DROP TABLE '.$this->Product->tablePrefix.'products';
    $s1 = mysql_query($sql);
    $sql = 'RENAME TABLE '.$this->Product->tablePrefix.'temp12212 TO '.$this->Product->tablePrefix.'products'; 
    $s2 =mysql_query($sql);
    if($s1 && $s2){
        mysql_query('COMMIT;');
        $this->Session->setFlash('Commit Successful to Database');
    }else{
        mysql_query('ROLLBACK;');
        $this->Session->setFlash('Commit failed due to some errors<br> auto-rollbacked to previous state');
    }

Ответы [ 3 ]

2 голосов
/ 25 января 2011

DROP TABLE - это одна из команд в MySql, которая вызывает неявную фиксацию.

http://dev.mysql.com/doc/refman/5.1/en/implicit-commit.html

Используйте это вместо:

'RENAME TABLE '.$this->Product->tablePrefix.'products TO backup_table
, '.$this->Product->tablePrefix.'temp12212 TO '.$this->Product->tablePrefix.'products';
1 голос
/ 25 января 2011

Вы не можете откатить оператор DROP TABLE или RENAME TABLE, поскольку он вызывает неявное принятие .

0 голосов
/ 25 января 2011
I sorted the problem this way instead!!! thanks all for your reply :-)  


 $sql = 'DROP TABLE IF EXISTS '.$this->Product->tablePrefix.'temp_backup';
        mysql_query($sql);
        $sql = 'RENAME TABLE '.$this->Product->tablePrefix.'products TO '.$this->Product->tablePrefix.'temp_backup, '.$this->Product->tablePrefix.'temp TO '.$this->Product->tablePrefix.'products'; 
        $status =mysql_query($sql);
        if($status){
            $sql = 'DROP TABLE '.$this->Product->tablePrefix.'temp_backup';
            mysql_query($sql);
            $this->Session->setFlash('Commit Successful to Database');
        }else{              
            $this->Session->setFlash('Commit failed due to some errors<br> auto-rollbacked to previous state');
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...