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

Chèn một hàng và tránh điều kiện đua (PHP / MySQL)

Thông thường, giải pháp cho các vấn đề đồng thời như vậy liên quan đến các giao dịch và khóa lạc quan :khi bạn cập nhật bộ đếm, hãy thêm where để kiểm tra giá trị cũ và đếm số hàng được cập nhật.

v = select value from counter where id=x.
update counter set value = v+1 where value = v and id=x

Nếu bộ đếm đã được cập nhật trong thời gian chờ đợi, thì bản cập nhật sẽ không thay đổi bất kỳ hàng nào - vì vậy bạn biết rằng bạn phải khôi phục và thử giao dịch thêm một lần nữa.

Một vấn đề là nó có thể dẫn đến sự tranh chấp cao độ , chỉ với một vài giao dịch thành công và rất nhiều giao dịch thất bại.

Sau đó, có thể tốt hơn là bám vào khóa bi quan , nơi bạn khóa hàng trước, sau đó cập nhật hàng. Nhưng chỉ một điểm chuẩn mới cho bạn biết.

CHỈNH SỬA

Nếu bạn sử dụng giao dịch mà không có khóa lạc quan, trường hợp sau có thể xảy ra.

Max authorized = 50. Current value = 49.

T1: start tx, read value --> 49
T2: start tx, read value --> 49
T1: update value --> 50, acquire a row lock
T1: commits --> release the lock
T2: update value --> 50, acquire a row lock
T2: commits --> release the lock

Cả hai giao dịch đều thành công, giá trị là 50, nhưng có sự mâu thuẫn.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tệp .PDF lớn Không tải lên cơ sở dữ liệu MySQL dưới dạng BLOB trung bình Qua PHP, tệp dưới 2MB Hoạt động tốt

  2. Truy xuất các hàng được nhóm theo giờ với MySQL

  3. Lỗi MySQL 1064 khi thêm khóa ngoại với MySQL Workbench

  4. Laravel:Làm cách nào để xóa các hàng khỏi nhiều bảng có cùng id chỉ với 1 truy vấn?

  5. Cách tính số người dùng hoạt động hàng tuần (WAU) trong MySQL