mysql文档 http://dev.mysql.com/doc/refman/5.5/en/implicit-commit.html指出某些语句将在事务期间导致隐式提交。例如:
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 不是有效的语法,并且会删除临时表不会导致隐式提交,所以我怀疑只是一个错误(至少截至 5.5.29)
无论如何,我想做的是告诉 mysql 永远不要隐式提交,而是在给出会导致隐式提交的命令时失败/回滚。
我怀疑没有办法做到这一点,环顾四周后,但我希望我错了。希望这里有人知道:)
我刚刚成功尝试的另一个 hacky 方法是通过 mysql 特定命令获取 create table DDL
SHOW CREATE TABLE `tableName`
然后使用一些正则表达式魔法并制作一个新的 DDL 查询,该查询将基于原始表创建一个临时表,并将所有更改表更改合并到创建表中。
在我的基于 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);
EDIT顺便说一句,这里有一些错误(功能)报告(多年来)。在第一个中,您可以看到一个响应(可追溯到 2006 年),其中指出:由于此行为与 oracle db 中的行为相同,因此这是一致的...
- http://bugs.mysql.com/bug.php?id=22857 http://bugs.mysql.com/bug.php?id=22857
- http://bugs.mysql.com/bug.php?id=28109 http://bugs.mysql.com/bug.php?id=28109
也许应该发起一个功能请求“垃圾邮件活动”才能使该功能请求复活!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)