2012-02-17 79 views
10

用一個簡單的事務中Mysql的事務回滾在更新

START TRANSACTION; 
UPDATE posts SET status='approved' where post_id='id' AND status != 'approved'; 
.. other queries ... 
COMMIT; 

我想改變狀態的時候只有一次進行交易;但上面的UPDATE不會在沒有行更新時回滾事務。

我該如何限制事務提交只有當行更新(我的意思是狀態改變)。

回答

11

這裏在PHP(沒有測試,需要適應你的情況):

mysql_query('START TRANSACTION;') 
mysql_query("UPDATE posts SET status='approved' where post_id='id' AND status != 'approved';"); 
if (mysql_affected_rows()){ 
    mysql_query('COMMIT'); 
} else { 
    mysql_query('ROLLBACK'); 
} 

,或者,如果你想聰明,這樣做在SQL(使用ROW_COUNT()IF):

START TRANSACTION; 
UPDATE posts SET status='approved' where post_id='id' AND status != 'approved'; 
SELECT ROW_COUNT() INTO @affected_rows; 
-- .. other queries ... 
IF (affected_rows > 0) THEN 
    COMMIT; 
ELSE 
    ROLLBACK; 
END IF 
+0

完美!事實上,我在PHP :) – Googlebot 2012-02-17 12:12:12

+0

@Ali我建議更新標籤比:P – Vyktor 2012-02-17 12:14:05

+0

不要運行「其他查詢」,然後將它們回滾,這有點無用。只需將它們移動到與COMMIT相同的代碼塊中,以便它們只在需要時執行(而不是始終執行,然後有時將它們回滾)。 – MatBailie 2012-02-17 12:17:23

5

你需要在某種編程邏輯中做到這一點 - 也許存儲過程是最好的。

  • START TRANSACTION
  • 運行UPDATE查詢
  • SELECT ROW_COUNT()INTO some_variable
  • IF (some_variable>0) THEN [運行中的其他語句包括COMMIT] ELSE ROLLBACK