mysqldocumentation声明某些语句将在事务期间导致隐式提交。例如:

CREATE TABLE foo (bar INT);
START TRANSACTION;
INSERT INTO foo VALUES (1);
CREATE TEMPORARY TABLE mumble like foo;
ALTER TABLE mumble modify bar INT UNSIGNED;
ROLLBACK;
SELECT * FROM foo;

在回滚之后,我从foo得到了一行数据——文档实际上说,如果使用临时关键字,alter table不应该导致隐式提交,但是alter temporary table不是有效的语法,并且删除临时表不会导致隐式提交,所以我怀疑只有一个bug(至少在5.5.29之前)
无论如何,我想做的是告诉mysql永远不要隐式提交,而是在命令发出时失败/回滚,这将导致隐式提交。
我怀疑这是没有办法的,我四处看看,但我希望我错了。希望这里的人知道:)

最佳答案

我刚刚成功尝试的另一种黑客方法是通过mysql特定的命令获取create table DDL

SHOW CREATE TABLE `tableName`

然后制作一些regexp魔术并创建一个新的DDL查询,该查询将基于原始表创建一个临时表,并将所有alter table更改合并到create table中。
在基于PHP的项目中,我执行了以下操作,以便向临时表添加唯一索引。它做到了这一点,并且在事务中不再发生隐式提交。
$createDDL = ... get from SHOW CREATE TABLE `tableName`
$nr = 0;
$createDDL = preg_replace("/CREATE TABLE `$tableName` \(/", "CREATE TEMPORARY TABLE `$tmpName` (\nUNIQUE `ukey-1` ($uniqCols),", $createDDL, -1, $nr);
if (!$nr)
  throw new Exception("CREATE TABLE replacement error. No reps made.");
mysqli_query($con, $createDDL);

顺便说一句,这里有一些bug(特性)报告(自多年以来)。在第一个示例中,您可以看到一个响应(2006年)声明:由于此行为与oracle db中的相同,因此这是一致的。。。
http://bugs.mysql.com/bug.php?id=22857
http://bugs.mysql.com/bug.php?id=28109
也许应该启动一个功能请求“垃圾邮件活动”来恢复此功能请求!

10-08 11:22