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

Làm thế nào để đảm bảo rằng không có điều kiện chạy đua trong cơ sở dữ liệu MySQL khi tăng một trường?

Đây là 3 cách tiếp cận khác nhau:

Cập nhật nguyên tử

update table set tries=tries+1 where condition=value;

và nó sẽ được thực hiện nguyên tử.

Sử dụng giao dịch

Nếu trước tiên bạn cần chọn giá trị và cập nhật giá trị đó trong ứng dụng của mình, bạn có thể cần sử dụng các giao dịch. Điều đó có nghĩa là bạn sẽ phải sử dụng InnoDB, không phải bảng MyISAM. Truy vấn của bạn sẽ giống như sau:

BEGIN; //or any method in the API you use that starts a transaction
select tries from table where condition=value for update;
.. do application logic to add to `tries`
update table set tries=newvalue where condition=value;
END;

nếu giao dịch không thành công, bạn có thể cần phải thử lại theo cách thủ công.

Lược đồ phiên bản

Một cách tiếp cận phổ biến là giới thiệu một cột phiên bản trong bảng của bạn. Các truy vấn của bạn sẽ tương tự như:

select tries,version from table where condition=value;
.. do application logic, and remember the old version value.
update table set tries=newvalue,version=version + 1 where condition=value and version=oldversion;

Nếu bản cập nhật đó không thành công / trả về 0 hàng bị ảnh hưởng, có nghĩa là ai đó đã cập nhật bảng trong thời gian trung bình. Bạn phải bắt đầu lại từ đầu - nghĩa là chọn các giá trị mới, thực hiện logic ứng dụng và thử cập nhật lại.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Xem tài trợ trong MySQL

  2. Cách lấy giá trị từ một cột trong bảng khi tồn tại hai cột cùng tên trong một phép nối sql

  3. Làm cách nào để sử dụng phần trăm (%) trong LIKE mà không bị coi là ký tự đại diện?

  4. MySQL ERROR 1005 (HY000):Không thể tạo bảng 'foo. # Sql-12c_4' (errno:150)

  5. MySql UUID trùng lặp BUG