Tôi đang cố gắng thực hiện một số phần MERGE
trong trình điều khiển MySQL trong Drupal. Tất nhiên, Drupal có một cái gì đó nhưng trong thực tế, nó chỉ hoạt động vì nhà phát hành MERGE thường xuyên nhất chỉ ăn ngoại lệ.
Vì vậy, bất cứ điều gì chúng ta cố gắng, bế tắc xảy ra. Những gì chúng tôi làm, chúng tôi bắt đầu một giao dịch, sau đó SELECT ... FOR UPDATE
, hãy thử INSERT
và nếu nó gây ra lỗi toàn vẹn 23xxx, hãy thử CẬP NHẬT thay thế. Bế tắc. Chúng tôi đã loại bỏ FOR UPDATE
cos chúng tôi quyết định rằng để sử dụng, nó ổn. Vẫn bế tắc.
Tôi không thể chuyển đổi các mức cô lập vì READ COMMITTED
cần ghi nhật ký hàng cho mỗi GIAO DỊCH THIẾT LẬP :
Kể từ MySQL 5.1, nếu bạn sử dụng READ CAM KẾT [...], bạn phải sử dụng ghi nhật ký nhị phân dựa trên hàng.
Và mỗi lần đọc UNCOMMITTED cũng cần ghi nhật ký hàng. Và đây là Cài đặt nhật ký nhị phân :
Để thay đổi giá trị binlog_format toàn cầu, bạn phải có đặc quyền SUPER. Điều này cũng đúng với giá trị phiên kể từ MySQL 5.1.29.
Tôi không thể yêu cầu mọi thiết lập Drupal phải có SUPER
và chúng ta không thể nói rằng Drupal không tương thích với các binlog dựa trên câu lệnh khi đó là mặc định và phổ biến nhất.
INSERT ... ON DUPLICATE KEY
không đủ linh hoạt cũng không phải là bế tắc miễn phí.
Giờ thì sao?
MERGE
không giải phóng bạn khỏi những bế tắc, (kinh nghiệm từ DBMS đã triển khai nó.) Và tôi không thể thấy điều gì sai khi xử lý các bế tắc. Bất cứ khi nào bạn có giao dịch, bạn phải xem xét rằng các bế tắc có thể xuất hiện.