2013-07-01 51 views
0

在我的項目中,我刪除並更新了許多表中的大量行,因此我決定使用事務。但是,即使發生錯誤並且腳本正在結束,事務也會被執行。即使發生錯誤,MySQL事務也會提交

我只用mysql_沒有mysqli_PDO,因爲它不支持該服務器上。

mysql_query("START TRANSACTION"); 
$res = mysql_query("some insert..."); 
if($res === false){ 
    //this save error log and exit script with die() or exit() 
    trigger_error(mysql_errno()."\n".mysql_error()); 
} 
$res = mysql_query("some delete..."); 
if($res === false){ 
    trigger_error(mysql_errno()."\n".mysql_error()); 
} 
mysql_query("COMMIT"); 

在我的項目我有我的mysql的類,所以我不喜歡這種類型,但是,這個辦法很有效。

當第一次查詢錯誤發生後,錯誤日誌保存結束腳本結束。但插入的數據保留在數據庫中。我雖然沒有執行COMMIT並且連接已關閉,但會自動發生ROLLBACK

P.S.我知道,使用mysqli應該更好,但這是相同的mysql_mysqli_,不是嗎?

+0

你應該只在成功之後提交,並且在錯誤之後回滾 – StasGrin

+0

我只在成功之後提交,但不會在錯誤時回滾。我認爲它是自動的。 – Arxeiss

回答

1

我建議閱讀:http://dev.mysql.com/doc/refman/5.0/en/commit.html,特別是關於SET autocommit = 0。我相信,如果你希望它不自動提交,你需要說出來,然後纔不會自動撥打COMMITROLLBACK您的發言。

不過最好還是有一個處理程序代碼,不會調用ROLLBACK否則你就是在信任的MySQL來完成所有的工作,你和與交易相關的MySQL的任何未來的變化可能不會得到妥善處理的危險通過你的代碼。

+0

順便說一句,在你發佈的網站上寫道,'START TRANSACTION'禁用autocommit。我添加了回滾到我的錯誤函數。但仍然不明白爲什麼數據被保存,當沒有執行COMMIT和'START TRANSACTION'禁用自動提交 – Arxeiss

+0

dunno,抱歉,需要「真正調試它」 – nrathaus

0

您確定數據保留在數據庫/提交而不執行提交查詢嗎?

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未能插入查詢不算數。

相關問題