Hãy xem xét tình huống này:Giao dịch có dừng tất cả các vấn đề về chủng tộc trong MySQL không?
- Bắt đầu giao dịch
- Insert 20 hồ sơ vào một bảng với một auto_increment chính
- Lấy id chèn đầu tiên (giả sử nó
153
) - Cập nhật tất cả các bản ghi trong bảng nơi
id >= 153
- Cam kết
Bước 4 có an toàn không?
Tức là, nếu yêu cầu khác đến gần như chính xác cùng một lúc và chèn 20 bản ghi khác sau bước 2 ở trên, nhưng trước bước 4, sẽ có điều kiện chủng tộc không?
Tại sao bạn có một bước cập nhật riêng biệt thay vì chỉ chèn dữ liệu chính xác vào vị trí đầu tiên? Đó là khá lạ. Bạn sẽ không cần phải lo lắng về "điều kiện chủng tộc" nếu bạn đã chèn dữ liệu chính xác vào vị trí đầu tiên. Cập nhật 'WHERE id> 153' cũng là một truy vấn rất lạ. Các id gia tăng tự động không có logic đối với chúng, và vì vậy bạn sẽ không bao giờ (theo như tôi biết) chỉ cập nhật dựa trên id. Và cuối cùng, tôi không biết về bất kỳ hàm "id chèn đầu tiên" nào. –
@ButtleButkus http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id "Nếu bạn chèn nhiều hàng bằng cách sử dụng một câu lệnh INSERT duy nhất, LAST_INSERT_ID() trả về giá trị được tạo cho hàng chèn đầu tiên " – nickf
Bạn đúng về LAST_INSERT_ID(), nhưng nó không thay đổi thực tế là câu hỏi dường như là về một tình huống giả định sẽ không bao giờ tồn tại nếu cấu trúc cơ sở dữ liệu cơ bản và thủ tục được theo sau. Tại sao tiêu chí cập nhật của bạn luôn là giá trị của một id vô nghĩa? Tôi không thể nghĩ ra lý do nào. Tôi sẽ không gọi đó là 'điều kiện chủng tộc' vì nó vô nghĩa. Tại sao bạn cập nhật ngay lập tức sau khi chèn, khi bạn chỉ có thể chèn các giá trị chính xác để bắt đầu?Đó là những lý do thực sự mà câu hỏi này không có ý nghĩa. –