Я пишу обновление для базы данных 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.