2011-04-28 29 views
9

Có hai bảng:Truy vấn MySQL có chứa truy vấn phụ nguyên tử không?

Bảng 1 Unique phiên

ID Count 

Bảng 2 (phiên)

ID Name 

Tôi muốn cập nhật count chỉ khi name không tồn tại vào các phiên để đếm các phiên duy nhất, đây là một ví dụ để khách quan không làm theo cách khác, nhưng stion is:

Rowsaffected = Update table1 
        set Count = Count + 1 
       where (Select count(*) from table2 where Name = 'user1') = 0; 

Insert into table2 (NAME) values('user'); 

Truy vấn đầu tiên có phải là truy vấn nguyên tử không? Nếu có, thì không có vấn đề gì.

Nếu không, thì Điều gì xảy ra nếu có nhiều luồng chạy để thực hiện các hoạt động được đề cập ở trên? Có một cơ hội:

Chủ đề 1: tổng số lần trả về 0, nó đã cập nhật bảng 1 nhưng không phải bảng 2 trước khi bắt đầu chuỗi 2. Chủ đề 2: Nó tìm thấy số 0, nó cũng sẽ cập nhật số lượng.

Bây giờ cho cùng một người dùng, hãy đếm là 2 điều không nên xảy ra.

Bất kỳ đề xuất/phản hồi nào.

Trả lời

1

Tùy thuộc vào công cụ lưu trữ bạn đang sử dụng.

dụ của bạn sẽ chỉ làm việc một cách chính xác với các công cụ MySQL hỗ trợ các giao dịch, như InnoDB vì nó thực hiện một cách chính xác việc xử lý giao dịch (và nhất quán mức tuyên bố đọc)

MyISAM không hỗ trợ giao dịch.

+1

@Johan: công cụ nào khác trong MySQL hỗ trợ giao dịch? Tôi không biết người khác là InnoDB –

+0

Ví dụ: NDBCluster, BDB – Johan

+0

Tôi đang sử dụng InnodDB, vì vậy bạn có nghĩa là truy vấn đầu tiên là nguyên tử trong tự nhiên, tức là cho đến khi truy vấn hoàn tất, không ai khác sẽ có thể đọc bảng đó? – Navin