2010-05-11 39 views
5

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?

  1. Bắt đầu giao dịch
  2. Insert 20 hồ sơ vào một bảng với một auto_increment chính
  3. Lấy id chèn đầu tiên (giả sử nó 153)
  4. Cập nhật tất cả các bản ghi trong bảng nơi id >= 153
  5. 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?

+0

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. –

+0

@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

+0

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. –

Trả lời

5

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?

Có, nó sẽ.

Hồ sơ 21 đến 40 sẽ bị khóa bởi giao dịch 2.

Giao dịch 1 sẽ bị chặn và đợi cho đến khi giao dịch 2 cam kết hoặc quay lại.

Nếu giao dịch 2 cam kết, sau đó giao dịch 1 sẽ cập nhật 40 hồ sơ (bao gồm cả những chèn vào bởi giao dịch 2)

+1

Bạn có thể làm rõ? Bạn đang nói có vấn đề hay không? – nickf

+0

@nickf: xem bài đăng cập nhật. – Quassnoi

0

Tôi không nghĩ rằng đây có thể được xếp vào mục lục như một điều kiện cuộc đua mà là một hành vi cụ thể DMBS. Về cơ bản nếu DBMS khóa các bản ghi mới được chèn vào, thì giao dịch đầu tiên sẽ không thấy các bản ghi từ bản ghi thứ hai cho đến khi giao dịch thứ hai được thực hiện.

Và tất nhiên có vấn đề khóa bảng, nếu giao dịch đầu tiên ghi bảng thì bảng thứ hai sẽ bị chặn khi ghi cho đến khi lệnh đầu tiên hoàn thành. Không chắc chắn mặc dù mysql tiêu chuẩn cung cấp loại tính năng này. Tôi biết máy chủ MSSQL nó.

Các vấn đề liên quan