您確定數據保留在數據庫/提交而不執行提交查詢嗎?
MySQL documentation:
隱含禁用自動提交模式單一系列的語句,使用START TRANSACTION語句:
START TRANSACTION;
SELECT @A:= SUM(salary)FROM table1 WHERE type = 1;
UPDATE table2 SET summary = @ WHERE type = 1;
COMMIT;
使用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)
我們看到,即使交易成功COMMITED未能插入查詢不算數。
你應該只在成功之後提交,並且在錯誤之後回滾 – StasGrin
我只在成功之後提交,但不會在錯誤時回滾。我認爲它是自動的。 – Arxeiss