Ролбек CREATE TABLE с использованием транзакций MySql - PullRequest
2 голосов
/ 15 марта 2012

Я пишу обновление для базы данных MySQL, используя PHP. Поведение апгрейдера должно быть следующим.

  • Если все запросы выполнены успешно, изменения должны быть зафиксированы.
  • В случае сбоя одного запроса все должно быть возвращено в прежнее состояние.

Часть моей программы выглядит следующим образом.

$host = 'localhost';
$user = 'root';
$password = 'root';
$db = 'transaction';
$con = mysqli_connect($host, $user, $password);
mysqli_select_db($con, $db);
mysqli_autocommit($con, FALSE);

$query1 = "create table `status` (
                      `id` int not null auto_increment,
                      `name` varchar(60) not null,
                    primary key  (`id`)
                    ) engine=innodb default charset=utf8;";
$result1 = mysqli_query($con, $query1);
$query2 = "ALTER TABLE status
                    CHANGE name value varchar(512);";

$result2 = mysqli_query($con, $query2);

if(!($result1 && $result2)) {
    mysqli_rollback($con);
} else {
    mysqli_commit($con);
}

mysqli_close($con);

Но если таблица 'status' уже существует, первый запрос создания таблицы завершается неудачно. Таким образом, оба запроса должны быть откатаны. Но запрос alter выполнен и не отменен.

Я видел сообщение, в котором перечислены все запросы, которые нельзя откатить в MySQL. http://www.sitepoint.com/mysql-transaction-gotchas-good-parts/

Есть ли какой-нибудь возможный способ вернуть эту роль обратно в mysql.

Ответы [ 3 ]

1 голос
/ 15 марта 2012

сделай это вручную

if(!($result1 && $result2)) {

    #drop table
    $query1 = "drop table `status`";
    $result = mysqli_query($con, $query1);   

}
1 голос
/ 15 марта 2012

Нет. Вам нужно будет выполнить новый запрос на изменение таблицы, отменяя предыдущий оператор изменения.

0 голосов
/ 16 марта 2012

Было бы лучше просто экспортировать данные в (скажем) коллекцию файлов CSV.Затем измените любые данные, если это необходимо для соответствия новой структуре.Затем просто создайте базу данных с новой структурой и импортируйте в нее данные.

Кажется более простым решением, чем попытка сделать обновление.

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