Bế tắc miễn phí MERGE-alike trong MySQL?


7

Tôi đang cố gắng thực hiện một số phần MERGEtrong 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ử INSERTvà 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 UPDATEcos 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 COMMITTEDcầ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ó SUPERvà 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 KEYkhông đủ linh hoạt cũng không phải là bế tắc miễn phí.

Giờ thì sao?


Xem api.drupal.org/api/drupal/ khăn để biết API Hợp nhất / Thực hiện của chúng tôi. Nó không yêu cầu bạn thực sự có một khóa duy nhất và bạn có thể chỉ định các hành vi khác nhau để cập nhật / chèn.
Berdir

4
MERGEkhô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.
ypercubeᵀᴹ

1
Phải có một số cập nhật vòng tròn cho một điều kiện bế tắc xuất hiện. Loại truy vấn sẽ không gây ra điều đó, thay vào đó là các cập nhật cụ thể đang được thực hiện.
Andrew Brennan

Câu trả lời:


1

Nếu có thể, hãy viết một Thủ tục lưu trữ để gói gọn toàn bộ tác vụ. đối phó với các ngoại lệ. Sau đó, có Drupal gọi SP.


0

Về tuyên bố dưới đây:

Để 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.

Bạn không cần phải cung cấp đặc quyền SUPER cho Drupal vì câu lệnh trên chỉ áp dụng nếu bạn muốn thay đổi định dạng nhật ký nhị phân khi chạy.

Dưới đây là những gì bạn cần làm:

Bạn có thể chọn định dạng ghi nhật ký nhị phân một cách rõ ràng bằng cách khởi động máy chủ MySQL với --binlog-format = type.

Bạn có thể đọc thêm về Cài đặt Định dạng Nhật ký nhị phân trong hướng dẫn sử dụng MySQL.


Nhưng đó chính xác là những gì chúng ta cần làm - chủ sở hữu trang web Drupal không phải luôn là chủ sở hữu máy chủ.
chx
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.