您确定数据保留在数据库中/在不执行提交查询的情况下提交吗?
MySQL 文档:
要为单个语句系列隐式禁用自动提交模式,请使用 START TRANSACTION 语句:
开始交易;
SELECT @A:=SUM(salary) FROM table1 WHERE type=1;
UPDATE table2 SET summary=@A WHERE type=1;
犯罪;
使用 START TRANSACTION,自动提交保持禁用状态,直到您使用 COMMIT 或 ROLLBACK 结束事务。然后自动提交模式恢复到之前的状态。
我使用 MySQL 5.5 和 PHP 5.3 测试了这段代码:
sql> create table t10 (id integer auto_increment primary key, status char(32))
<?php
if( ($link = mysql_connect("localhost", "db_user", "*****")) === false )
exit(1);
mysql_select_db("test", $link);
var_dump(mysql_query("start transaction;"));
var_dump(mysql_query("insert into t10 (status) values (\"foo1\"), (\"foo2\");"));
exit();
//var_dump(mysql_query("commit;"));
var_dump(mysql_close());
?>
值 foo1 和 foo2 未插入到数据库表 t10 中。还要记住,在“全有或全无”规则的意义上,MySQL 事务并不是完全原子的。您可以提交一个事务,其中一半语句已完成,另一半则失败(来源:Kouber Saparev 于 2010 年 12 月 3 日上午 11:01 在 MySQL 页面http://dev.mysql.com/doc/refman/5.5/en/ ansi-diff-transactions.html)。
测试用例:
mysql> create table t7 (id integer primary key auto_increment, name text, lastname text);
Query OK, 0 rows affected (0.04 sec)
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)
mysql> insert into t7 (name, lastname) values('name1', 'lastname1');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t7 (name, lastname) values('name1', 'lastname1');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t7 (name, lastname) ('name1', 'lastname1');
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near ''name
1', 'lastname1')' at line 1
mysql> commit;
Query OK, 0 rows affected (0.01 sec)
mysql> select * from t7;
+----+-------+-----------+
| id | name | lastname |
+----+-------+-----------+
| 1 | name1 | lastname1 |
| 2 | name1 | lastname1 |
+----+-------+-----------+
2 rows in set (0.00 sec)
我们看到即使事务已成功提交,失败的插入查询也不计数。