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

mysql - Khóa các hàng cho truy vấn đã chọn?

Khóa MySQL gốc không cung cấp chức năng này. Bạn có thể sử dụng một cột để thực hiện "khóa" của mình.

Giả sử mỗi luồng có một ID duy nhất, bạn có thể tạo một cột có tên thread_owner , với mặc định là 0.

Một chuỗi sẽ lấy một hàng như thế này:

UPDATE mytable
SET thread_owner = :my_threadID
WHERE thread_owner = 0
LIMIT 1

Sau đó, chọn hàng như thế này (nó có thể không trả về, nếu không có hàng nào được xử lý):

SELECT *
FROM mytable
WHERE thread_owner = :my_threadID

Sau đó, xử lý và cuối cùng là xóa nó.

Giải pháp này sẽ hoạt động trên cả MyISAM và InnoDB.

Tuy nhiên, đối với InnoDB, nó có thể chậm vì mỗi câu lệnh UPDATE đang cố gắng khóa tất cả các hàng có thread_owner =0 và trừ khi bạn chắc chắn rằng mình đang khóa tất cả các hàng theo cùng một thứ tự mỗi lần, nó thậm chí có thể gây ra bế tắc. Vì vậy, bạn có thể thử khóa toàn bộ bảng một cách rõ ràng trong câu lệnh UPDATE của mình:

LOCK TABLES mytable WRITE;
UPDATE mytable
SET thread_owner = :my_threadID
WHERE thread_owner = 0
LIMIT 1;
UNLOCK TABLES;

Bằng cách đó, cả MyISAM và InnoDB sẽ hoạt động theo cùng một cá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. Cách nhập và xuất cơ sở dữ liệu qua phpMyAdmin (Lỗi 'Access bị từ chối tạo cơ sở dữ liệu db_name')

  2. Khoá và giá trị thuộc tính sản phẩm WooCommerce được lưu trữ ở đâu

  3. MySql - Tạo bảng nếu không tồn tại Cắt ngắn khác?

  4. Tại sao bản cập nhật MySQL này không hoạt động?

  5. Xây dựng lại mô hình mà không mất dữ liệu trong MySQL cho Symfony