Không, tôi không nghĩ rằng các quy định của bạn dẫn đến một hệ thống mà chúng ta phải xem xét tuần tự hóa.
Cách ly ảnh chụp là một kỹ thuật đảm bảo giao dịch nhìn thấy cùng một tập dữ liệu trong toàn bộ giao dịch. Cách ly ảnh chụp cung cấp một số đảm bảo nhưng không xác định tất cả các đặc điểm cần thiết để hiểu cách các giao dịch thực sự hoạt động (trừ khi chúng tôi chọn cách phân tách cách ly ảnh chụp nhanh và MVCC).
Cách ly ảnh chụp được thực hiện phổ biến nhất bằng cách sử dụng MVCC, Kiểm soát nhất quán nhiều phiên bản. MVCC định nghĩa chi tiết hơn về các giao dịch trong bối cảnh ảnh chụp nhanh của họ: có nghĩa là họ chỉ yêu cầu cách ly khi ghi xung đột (chỉ vị trí, hoặc, vị trí + giá trị, tùy thuộc vào việc triển khai). MVCC cung cấp một mô hình nhất quán thoải mái và bị viết sai.
Các mô hình nhất quán thư giãn là khó hiểu bởi vì chúng giống như một sự lai tạo giữa không cô lập và cô lập hoàn toàn.
Vì vậy, trước tiên hãy bắt đầu với một mô hình tương tranh nghiêm ngặt. Hai giao dịch phải được cách ly với nhau nếu một giao dịch ghi vào bất kỳ dữ liệu nào mà dữ liệu kia đọc hoặc ghi (và ngược lại ...).
Khi chúng tôi không biết lý do tại sao giao dịch đọc dữ liệu, chúng tôi phải cho rằng việc đọc giá trị khác có thể thay đổi hành vi của khách hàng liên quan, đó là lý do tại sao điều kiện giao dịch chồng chéo cho thấy sự cô lập. Nếu không tách biệt, việc đọc dữ liệu cũ trong ảnh chụp nhanh có thể dễ dàng thể hiện tính nhất quán thoải mái, một thuật ngữ khác không nhất quán, nghĩa là lỗi.
Chúng tôi chỉ cần xem xét dữ liệu chính xác được đọc hoặc ghi bởi các giao dịch, bất kỳ dữ liệu nào bên ngoài bộ đó không cần phải xem xét. Tuy nhiên, điều quan trọng là phải nhận ra rằng khi chúng ta nói về dữ liệu được đọc bởi một giao dịch, chúng ta nhất thiết phải bao gồm bất kỳ và tất cả dữ liệu "meta" (và dữ liệu và siêu dữ liệu được đọc bởi các hoạt động meta như kiểm tra các ràng buộc). Ví dụ về dữ liệu meta là / hoạt động meta là: xác định khóa chính mới duy nhất; khác là tổng của toàn bộ một cột; khác là tìm kiếm một cái gì đó và không tìm thấy nó; phạm vi tìm kiếm hoặc tổng. Điều này đi đến nhận xét của @ Matthew về việc ngăn chặn các bản sao, cũng như câu trả lời của @Tersizardos, trong đó anh ta xem xét trạng thái.
Ví dụ: điều này có nghĩa là hai giao dịch trùng nhau (yêu cầu cách ly) khi cả hai cùng chèn một hàng (giả sử ràng buộc khóa chính duy nhất) bởi vì kiểm tra ràng buộc khóa đồng nghĩa với việc đọc toàn bộ cột khóa chính. Một ví dụ khác, tìm kiếm một cái gì đó và tìm thấy nó giống như đọc một giá trị đó, tuy nhiên, không tìm thấy nó cũng giống như xem xét mọi giá trị trong cột.
MVCC chỉ bảo vệ chống lại việc ghi chồng chéo hoặc xung đột, nhưng không bảo vệ chống lại việc đọc (trừ khi được viết bởi giao dịch đó). Do đó, để có được lỗi thống nhất trong MVCC, tất cả những gì chúng ta cần làm là đọc thứ gì đó được thay đổi bởi một giao dịch khác (trong đó giao dịch khác xảy ra sau khi có ảnh chụp nhanh của nhà tạo mẫu, nhưng trước tiên vẫn tiếp tục sử dụng dữ liệu cũ và đưa ra bất kỳ quyết định nào khác nhau dựa trên dữ liệu cũ đó so với những gì nó đã làm được dữ liệu cập nhật. Nó dễ gây ra hơn bạn nghĩ.
Tính nhất quán thoải mái là một cách khác để nói có khả năng không nhất quán hoặc dễ bị lỗi. (Tính nhất quán được nới lỏng không nên bị nhầm lẫn với tính nhất quán cuối cùng, đây là một dạng lỗi phổ biến khác dễ mắc phải từ "NoQuery".)
Đối với câu hỏi của bạn, khi bạn nói rằng các giao dịch không bao giờ cần nhiều hơn một đối tượng, điều này phải áp dụng cho cả đọc và ghi và siêu dữ liệu (và hoạt động meta), bao gồm kiểm tra tính nhất quán, tổng hợp cột, kiểm tra vắng mặt, tìm kiếm phạm vi, v.v. .: nếu vậy, thì cho đến nay rất tốt.
Tuy nhiên...
Tôi lấy từ câu hỏi của bạn rằng bạn đang sử dụng cách ly ảnh chụp nhanh (MVCC) trên các đối tượng riêng lẻ (nói thay vì khóa đối tượng). (Bạn cũng đề cập đến CAS; tôi đã nghe nói về so sánh và trao đổi, và, thử nghiệm và thiết lập, nhưng không phải kiểm tra và thiết lập, mặc dù tôi cho rằng nó tương tự nhau).
Câu hỏi của bạn viết lên gợi ý cho tôi rằng "đối tượng" có nhiều hơn một lĩnh vực, nếu không các quy định của câu hỏi sẽ không cần thiết.
Do đó, vì các đối tượng được xử lý bằng snapshott / MVCC của bạn có nhiều trường hơn một trường, bạn có xu hướng viết nghiêng trong các đối tượng đơn lẻ. Nếu hai giao dịch cập nhật cùng một đối tượng cùng một lúc, người ta có thể đọc một trường giá trị của đối tượng bị cũ bởi một giao dịch khác đồng thời trên cùng một đối tượng và tiếp tục mà không biết, do đó, có sự không nhất quán tiềm ẩn (còn gọi là lỗi).
Thay vào đó, bạn có thể sử dụng khóa đối tượng, điều này sẽ ngăn hai giao dịch (để cập nhật) thậm chí nhìn vào cùng một đối tượng nếu một giao dịch khác đang trong quá trình thực hiện.
Tôi tin rằng có thể thực hiện một hình thức cách ly ảnh chụp thay thế khác mà không cần sử dụng mô hình so sánh chỉ ghi bị hỏng của MVCC. Vì vậy, bạn có thể (về mặt thuật toán) quảng bá bộ so sánh từ chỉ ghi để bao gồm cả bộ đọc. Sau đó, hai giao dịch cập nhật cùng một đối tượng sẽ không thể gây ra sai lệch ghi (vì giao dịch cố gắng cam kết sau đó sẽ bị hủy bỏ). Tôi nghĩ rằng đây có thể là giải pháp phù hợp cho vấn đề bạn mô tả, bởi vì bạn đã nhận được hầu hết lợi ích mà MVCC sẽ mua cho chúng tôi, bằng cách loại trừ các giao dịch đa đối tượng.
. hoặc chúng tôi không xem xét siêu dữ liệu (có khả năng được sử dụng bởi các hoạt động meta), sau đó chúng tôi có một mô hình cho phép lỗi.)