Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Câu hỏi hóc búa về giao dịch MySQL

MySQL chuyển mã lỗi cho người gọi và dựa trên mã lỗi này, người gọi có thể tự do quyết định xem họ có muốn hoàn thành công việc cho đến thời điểm này hay không (bỏ qua lỗi với INSERT cụ thể này tuyên bố) hoặc để khôi phục giao dịch.

Điều này không giống như PostgreSQL vốn luôn hủy bỏ giao dịch do nhầm lẫn và hành vi này là nguồn gốc của nhiều vấn đề.

Cập nhật:

Việc sử dụng ROLLBACK vô điều kiện là một thực tiễn tồi bên trong các thủ tục được lưu trữ.

Các thủ tục được lưu trữ có thể xếp chồng lên nhau và các giao dịch thì không, do đó, một ROLLBACK trong một thủ tục được lưu trữ lồng nhau sẽ quay trở lại thời điểm ban đầu của giao dịch, không phải trạng thái thực thi thủ tục đã lưu trữ.

Nếu bạn muốn sử dụng các giao dịch để khôi phục trạng thái cơ sở dữ liệu khi có lỗi, hãy sử dụng SAVEPOINT cấu trúc và DECLARE HANDLER để quay lại các điểm lưu:

CREATE PROCEDURE prc_work()
BEGIN
        DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK TO sp_prc_work;
        SAVEPOINT sp_prc_work;
        INSERT  …;
        INSERT  …;
        …
END;

Không thành công trong một trong hai lần chèn sẽ khôi phục tất cả các thay đổi được thực hiện bởi quy trình và thoát khỏi nó.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm việc xung quanh giới hạn 61 bảng JOIN trong MySQL bằng cách lồng các truy vấn con vào nhau

  2. MSQL:Làm cách nào để ghi đè mục nhập chỉ khi mục nhập mới cao hơn? khác tạo mục nhập mới

  3. Làm cách nào tôi có thể thực hiện nhiều truy vấn trong một trang?

  4. JPA nhiều liên quan đến nhiều quan hệ không chèn vào bảng đã tạo

  5. Lưu trữ hình ảnh trong cơ sở dữ liệu trực tiếp hay dưới dạng dữ liệu base64?