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

Sự cố khóa MySQL với InnoDB

Điều này gây ra bế tắc vì UPDATE truy vấn đang khóa tất cả các hàng trong bảng và tùy thuộc vào các chỉ mục được sử dụng (hoặc thiếu), hai phiên khác nhau sẽ có khả năng khóa chúng theo thứ tự hơi khác nhau. Hãy nhớ rằng UPDATE , DELETESELECT ... FOR UPDATE sẽ khóa tất cả các hàng mà chúng gặp phải, cho dù các hàng đó khớp với tất cả WHERE điều kiện hay không. Vì vậy, khi sử dụng chúng, bạn nên cố gắng đảm bảo rằng chúng gặp ít hàng nhất có thể, bằng cách sử dụng các chỉ mục (lý tưởng là khóa chính) và tránh các điều kiện mơ hồ hoặc chọn rộng.

Đề xuất của tôi cho hàng đợi công việc là khá phổ biến:Khóa càng ít càng tốt, càng hiếm càng tốt và luôn theo thứ tự xác định. Vì vậy, nói chung:

  1. Sử dụng các lần đọc không khóa (SELECT thông thường ) để tìm công việc cần làm bằng cách tìm kiếm những thứ mà nhân viên của bạn biết cách làm và hiện chưa có người nhận (lease_owner IS NULL AND lease_expiry IS NULL - hoặc tương tự).
  2. Chọn một hạng mục công việc (hoặc một vài hạng mục nếu bạn dám, nhưng một hạng mục đơn giản hơn nhiều và thường cho phép hiệu suất hoàn toàn có thể chấp nhận được).
  3. Cập nhật mục công việc của bạn (để yêu cầu nó, nhưng đối với mọi trường hợp, nó cũng cần cập nhật):
    1. Mở một giao dịch.
    2. Khóa mục công việc đã chọn của bạn bằng SELECT ... FOR UPDATE - Nếu nó không còn vô thừa nhận, hãy hủy bỏ và chọn một cái khác.
    3. Cập nhật hạng mục công việc bạn đã chọn với id công nhân và thời gian hết hạn cho hợp đồng thuê của bạn.
    4. Thực hiện giao dịch của bạn ngay lập tức.
  4. Bắt đầu thực hiện các hạng mục công việc đã thuê của bạn.
  5. Trong một số quy trình khác, một người thăm dò ý kiến ​​khác sẽ tìm kiếm công việc bị bỏ rơi và hủy xác nhận quyền sở hữu (thông qua quy trình cập nhật tương tự ở trên).

Bạn có thể dễ dàng đạt được thông lượng rất cao với thiết kế này (hàng nghìn công việc mỗi giây), và về cơ bản không có tranh chấp và không có vấn đề về thứ tự. Tối ưu hóa để chọn công việc ít có khả năng xung đột với các bộ đánh bóng khác rất đơn giản và hiệu quả (ví dụ:mô đun trên ID công việc hoặc tương tự, được chọn để tránh chết đói công việc). Điều quan trọng là hãy nhớ rằng xung đột trong việc lựa chọn công việc là không sao - chỉ cần hủy bỏ và thử lại và mọi thứ sẽ diễn ra rất nhanh chóng.

Tất cả các ghi khóa cho các mục / công việc trong hàng đợi công việc chỉ nên được thực hiện trên hàng đơn và bằng khóa chính chỉ .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. html xem chi tiết thả xuống giá trị đã chọn không được chèn vào MYSQL

  2. python chậm hơn 5 lần so với truy vấn perl mySql

  3. Định dạng dòng lệnh MySQL với UTF8

  4. Tạo cơ sở dữ liệu mysql và người dùng trong tập lệnh bash

  5. Cấu trúc dữ liệu cho các loại giải đấu / cạnh tranh khác nhau (giải đấu, thang, loại trực tiếp đơn / đôi, v.v.)