2012-02-17 24 views
10

Với một giao dịch đơn giản nhưMysql rollback giao dịch trên thất bại trong bản cập nhật

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

Tôi muốn thực hiện các giao dịch một lần duy nhất khi thay đổi trạng thái; nhưng ở trên UPDATE sẽ không đưa ra lỗi để khôi phục giao dịch khi không có hàng nào được cập nhật.

Làm cách nào để hạn chế giao dịch chỉ thực hiện nếu hàng được cập nhật (ý tôi là trạng thái được thay đổi).

Trả lời

11

Dưới đây là trong PHP (chưa được thử nghiệm , cần thích ứng với hoàn cảnh của bạn):

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'); 
} 

Hoặc, Nếu bạn muốn được thông minh và làm điều đó trong SQL (sử dụng 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

Perfect! Như một vấn đề của thực tế, tôi đang trong PHP :) – Googlebot

+0

@Ali Tôi khuyên bạn nên cập nhật thẻ hơn: P – Vyktor

+0

Không chạy "các truy vấn khác" sau đó cuộn chúng trở lại, đó là một chút vô giá. Chỉ cần di chuyển chúng vào cùng một khối mã như COMMIT, vì vậy chúng chỉ bao giờ thực thi nếu cần thiết (trái với việc luôn luôn thực hiện, sau đó thỉnh thoảng quay chúng lại). – MatBailie

5

Bạn sẽ cần thực hiện điều này trong một số loại logic lập trình - có thể quy trình được lưu trữ là tốt nhất.

  • START TRANSACTION
  • chạy UPDATE truy vấn
  • CHỌN ROW_COUNT() VÀO some_variable
  • IF (some_variable>0) THEN [chạy các báo cáo khác bao gồm COMMIT] ELSE ROLLBACK
Các vấn đề liên quan