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

MySQL:Cách đạt được khóa giao dịch cấp hàng thay vì khóa bảng

Có thể hữu ích khi xem cách truy vấn này thực sự được thực thi bởi MySQL:

select * from tbl_codes where available = 1 order by rand() limit 1 for update

Thao tác này sẽ đọc và sắp xếp tất cả các hàng phù hợp với WHERE điều kiện, tạo một số ngẫu nhiên bằng cách sử dụng rand() vào một cột ảo cho mỗi hàng, sắp xếp tất cả các hàng (trong bảng tạm thời) dựa trên cột ảo đó, sau đó trả lại các hàng cho máy khách từ tập hợp đã sắp xếp cho đến khi LIMIT đạt được (trong trường hợp này chỉ là một). FOR UPDATE ảnh hưởng đến việc khóa được thực hiện bởi toàn bộ câu lệnh trong khi nó đang thực thi và do đó mệnh đề được áp dụng khi các hàng được đọc trong InnoDB , không khi chúng được trả lại cho khách hàng.

Bỏ qua những tác động về hiệu suất rõ ràng của những điều trên (thật khủng khiếp), bạn sẽ không bao giờ có được hành vi khóa hợp lý từ nó.

Câu trả lời ngắn gọn:

  1. Chọn hàng bạn muốn, sử dụng RAND() hoặc bất kỳ chiến lược nào khác mà bạn thích, để tìm PRIMARY KEY giá trị của hàng đó. Ví dụ:SELECT id FROM tbl_codes WHERE available = 1 ORDER BY rand() LIMIT 1
  2. Khóa hàng bạn muốn bằng cách sử dụng PRIMARY KEY của hàng đó chỉ có. Ví dụ:SELECT * FROM tbl_codes WHERE id = N

Hy vọng rằng điều đó sẽ hữu í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ó danh sách ký tự không được phép cho các tên cột của bảng mysql không?

  2. Sự khác biệt giữa INSERT và UPDATE trong MySQL là gì?

  3. MySQL - Loại bỏ giá trị mặc định cho trường Datetime

  4. Làm cách nào để lưu hình dạng lớp phủ bản đồ Google trong cơ sở dữ liệu?

  5. Biên dịch NSIS - mysql Không được công nhận là chương trình có thể hoạt động - Tại sao câu lệnh NsExec ::ExecToLog không thành công?