Liệu đồng thời lạc quan trên mỗi đối tượng có ngụ ý tính tuần tự nếu một giao dịch sẽ không bao giờ kéo dài nhiều đối tượng không?


13

Đưa ra một hệ thống cung cấp:

  • Kiểm soát đồng thời / phiên bản tối ưu cho mỗi đối tượng (sử dụng CAS - Kiểm tra và thiết lập)
  • Các giao dịch không bao giờ cần kéo dài hơn một đối tượng.
  • Ảnh chụp cách ly

Là hệ thống này được coi là tuần tự hóa ?

Từ cách ly ảnh chụp

Trong trường hợp sai lệch ghi, hai giao dịch (T1 và T2) đồng thời đọc một tập dữ liệu chồng chéo (ví dụ: các giá trị V1 và V2), đồng thời thực hiện các cập nhật khác nhau (ví dụ: cập nhật T1, cập nhật V2, V2) và cuối cùng không cam kết, không thấy bản cập nhật được thực hiện bởi người khác. Nếu hệ thống được tuần tự hóa, một sự bất thường như vậy sẽ là không thể, vì T1 hoặc T2 sẽ phải xảy ra "đầu tiên", và có thể nhìn thấy đối phương. Ngược lại, cho phép cách ly ảnh chụp viết dị thường xiên.

Một ví dụ cụ thể, hãy tưởng tượng V1 và V2 là hai số dư được giữ bởi một người duy nhất, Phil. Ngân hàng sẽ cho phép V1 hoặc V2 chạy thâm hụt, với điều kiện tổng số nắm giữ ở cả hai không bao giờ âm (ví dụ: V1 + V2 0). Cả hai số dư hiện tại là 100 đô la. Phil bắt đầu hai giao dịch đồng thời, T1 rút 200 đô la từ V1 và T2 rút 200 đô la từ V2.

Dựa trên điều này có vẻ như có khả năng viết xiên là lý do duy nhất cho một hệ thống đảm bảo Cách ly Snapshot không được nối tiếp.

Tuy nhiên, trong một hệ thống không cho phép giao dịch trải rộng trên nhiều đối tượng (trong ví dụ trên V1 và V2), dường như không thể xảy ra sai lệch ghi .

Do đó, hệ thống được mô tả ở trên là tuần tự hóa. Điều này có đúng không?


1
Tôi nghĩ rằng câu trả lời là có, với điều kiện là cơ sở dữ liệu được phép hủy bỏ các giao dịch sẽ giới thiệu sai lệch ghi - nếu các giao dịch bị giới hạn đọc / ghi một đối tượng, thì chúng bị tách rời hoặc va chạm.
pjc50

2
Tôi nghĩ rằng bạn cũng sẽ cần một số cách để ngăn chặn các bản ghi trùng lặp cho một cam kết ban đầu. Trong trường hợp này, hai nhà văn lạc quan có thể nhìn thấy một ảnh chụp trống và bản ghi đó là mới và do đó bạn có thể có hai đối tượng, mỗi đối tượng ở phiên bản 0.
Matthew Mark Miller

Câu trả lời:


1

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


0

Tôi nghĩ, như @ pjc50 đã nêu, (Nhấn mạnh thêm :) " nếu các giao dịch bị giới hạn đọc / ghi một đối tượng" thì "câu trả lời là có". Tuy nhiên, tôi nghĩ rằng nơi này rơi xuống là trong ý tưởng của một đơn đối tượng.

Trong ví dụ được lấy từ cách ly Ảnh chụp , T1 và T2 không chia sẻ bất kỳ giá trị nào. Tuy nhiên, chúng vẫn là một tiềm năng cho một sai lệch ghi vì " không [đã] thấy bản cập nhật được thực hiện bởi nguồn " khác . Do đó, khả năng của một giao dịch là xem tất cả các cập nhật khác trước khi cam kết làm cho một giao dịch thực sự được tuần tự hóa.

Từ tính tuần tự :

Tính tuần tự của lịch biểu có nghĩa là sự tương đương (trong kết quả, trạng thái cơ sở dữ liệu, giá trị dữ liệu) với lịch biểu nối tiếp (nghĩa là tuần tự không có giao dịch trùng lặp về thời gian) với cùng một giao dịch.

Thật không may, vì điều này (và như @Matthew Mark Miller chỉ ra), chúng tôi cũng phải xem xét trạng thái cũng như các giá trị. Với sự cân nhắc này, hai giao dịch sử dụng OCC sẽ có khả năng ghi sai bất cứ khi nào bất kỳ trạng thái cơ sở dữ liệu nào được viết .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.