Phiên bản được hỗ trợ:hiện tại(17) /16 / 15 / 14 / 13
Phiên bản phát triển:18 / Devel
Phiên bản không được hỗ trợ:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1
Tài liệu này dành cho phiên bản không được hỗ trợ của PostgreSQL.
Bạn có thể muốn xem cùng một trang chohiện tạiPhiên bản hoặc một trong các phiên bản được hỗ trợ khác được liệt kê ở trên thay thế.

13.2. Phân lập kèo bóng đá c1

TheSQLĐịnh nghĩa tiêu chuẩn Bốn cấp độ cô lập kèo bóng đá c1 về ba hiện tượng phải được ngăn chặn giữa các kèo bóng đá c1 đồng thời. Những cái này Hiện tượng không mong muốn là:

đọc bẩn

Một kèo bóng đá c1 đọc dữ liệu được viết bởi một đồng thời kèo bóng đá c1 không cam kết.

11420_11441

Một kèo bóng đá c1 đọc lại dữ liệu mà nó đã đọc trước đó và thấy rằng dữ liệu đã được sửa đổi bởi một kèo bóng đá c1 khác (cam kết đó kể từ lần đọc ban đầu).

Phantom Read

Một kèo bóng đá c1 tái lập một truy vấn trả về một bộ hàng đáp ứng điều kiện tìm kiếm và thấy rằng bộ của các hàng thỏa mãn điều kiện đã thay đổi do một kèo bóng đá c1 cam kết gần đây.

Bốn kèo bóng đá c1 mức độ cô lập và các hành vi tương ứng được mô tả trongBảng 13-1.

Bảng 13-1.SQLCấp độ cô lập kèo bóng đá c1

Cấp độ cô kèo bóng đá c1 đọc bẩn không thể lặp lại đọc Phantom Read
Đọc không được cam kết có thể có thể có thể
Đọc cam kết Không thể có thể có thể
Đọc lặp lại Không thể Không thể có thể
serializable Không thể Không thể Không thể

inPostgreSQL, bạn có thể Yêu cầu bất kỳ trong số bốn cấp độ phân lập kèo bóng đá c1 tiêu chuẩn. Nhưng bên trong, chỉ có hai mức độ cô lập khác biệt, tương ứng với các cấp độ đọc cam kết và có thể nối tiếp. Khi bạn chọn cấp độ đọc không được cam kết, bạn thực sự được đọc Cam kết và khi bạn chọn lặp lại, bạn thực sự nhận được Có thể nối tiếp, vì vậy mức độ cô lập thực tế có thể nghiêm ngặt hơn hơn những gì bạn chọn. Điều này được cho phép theo tiêu chuẩn SQL: Bốn mức độ cô lập chỉ xác định hiện tượng nào không được xảy ra, họ không định nghĩa hiện tượng nào phải xảy ra. Các Lý do rằngPostgreSQLChỉ cung cấp hai cấp độ cô kèo bóng đá c1 là đây là điều duy nhất hợp lý Cách để ánh xạ các mức cách cô kèo bóng đá c1 tiêu chuẩn đến đa dạng Kiến trúc kiểm soát đồng thời. Hành vi của có sẵn Mức cách cô kèo bóng đá c1 được chi tiết trong các tiểu mục sau.

14388_14465Đặt kèo bóng đá c1 DỊCH.

13.2.1. Đọc cam kết cô kèo bóng đá c1 Mức độ

Đọc cam kếtlà mặc định Mức cách cô kèo bóng đá c1 trongPostgreSQL. Khi một kèo bóng đá c1 chạy ở cấp độ cô lập này, AChọnTruy vấn chỉ thấy dữ liệu được cam kết trước khi Truy vấn bắt đầu; nó không bao giờ thấy dữ liệu hoặc thay đổi không được cam kết cam kết trong quá trình thực hiện truy vấn bằng các kèo bóng đá c1 đồng thời. (Tuy nhiên,Chọnkhông xem hiệu ứng của các bản cập nhật trước được thực hiện trong chính nó kèo bóng đá c1, mặc dù họ chưa cam kết.) Hiệu ứng, AChọnTruy vấn thấy ảnh chụp nhanh của cơ sở dữ liệu kể từ khi truy vấn đó bắt đầu chạy. Lưu ý rằng hai liên tiếpChọn15505_15670Chọn.

Cập nhật, Xóa, Chọn cho CẬP NHẬTChọn chia sẻCác lệnh hoạt động giống nhưChọn15941_16755WHEREmệnh đề) được đánh giá lại để xem phiên bản cập nhật của Hàng vẫn phù hợp với điều kiện tìm kiếm. Nếu vậy, thứ hai Cập nhật tiến hành hoạt động của nó, bắt đầu từ bản cập nhật phiên bản của hàng. (Trong trường hợp củaChọn Để cập nhậtChọn để chia sẻ,, Điều đó có nghĩa là nó là phiên bản cập nhật của hàng bị khóa và trả lại cho máy khách.)

Vì quy tắc trên, có thể cập nhật lệnh để xem một ảnh chụp nhanh không nhất quán: nó có thể thấy các hiệu ứng của các lệnh cập nhật đồng thời ảnh hưởng đến cùng một hàng đang cố gắng cập nhật, nhưng nó không thấy hiệu ứng của những điều đó Các lệnh trên các hàng khác trong cơ sở dữ liệu. Hành vi này làm cho Đọc chế độ cam kết không phù hợp với các lệnh liên quan đến điều kiện tìm kiếm phức tạp. Tuy nhiên, nó chỉ là đúng cho trường hợp đơn giản hơn. Ví dụ: xem xét cập nhật số dư ngân hàng với các kèo bóng đá c1 như

Bắt đầu;
Cập nhật tài khoản đặt số dư = số dư + 100.00 trong đó acctnum = 12345;
Cập nhật tài khoản đặt số dư = số dư - 100.00 trong đó acctnum = 7534;
LÀM;

Nếu hai kèo bóng đá c1 như vậy đồng thời cố gắng thay đổi số dư tài khoản 12345, chúng tôi rõ ràng muốn cái thứ hai kèo bóng đá c1 để bắt đầu từ phiên bản cập nhật của tài khoản hàng ngang. Bởi vì mỗi lệnh chỉ ảnh hưởng đến một hàng, cho phép nó xem phiên bản cập nhật của hàng không Tạo bất kỳ sự không nhất quán rắc rối nào.

Vì trong chế độ đã cam kết, mỗi lệnh mới bắt đầu bằng một Ảnh chụp mới bao gồm tất cả các kèo bóng đá c1 được thực hiện ngay lập tức, các lệnh tiếp theo trong cùng một kèo bóng đá c1 sẽ xem các tác động của kèo bóng đá c1 đồng thời đã cam kết trong bất kỳ trường hợp. Điểm gặp vấn đề ở đây là liệu có hay không trong mộtđơnLệnh chúng ta thấy một cái nhìn hoàn toàn nhất quán của cơ sở dữ liệu.

18766_19116

13.2.2. Phân kèo bóng đá c1 serializable Mức độ

Cấp độserializableCung cấp Phân lập kèo bóng đá c1 nghiêm ngặt nhất. Cấp độ này mô phỏng nối tiếp thực thi kèo bóng đá c1, như thể các kèo bóng đá c1 đã được thực thi một sau người khác, thanh thản, thay vì đồng thời. Tuy nhiên, Các ứng dụng sử dụng cấp độ này phải được chuẩn bị để thử lại kèo bóng đá c1 do lỗi tuần tự hóa.

Khi một kèo bóng đá c1 ở cấp độ có thể nối tiếp, AChọnTruy vấn chỉ thấy dữ liệu cam kết Trước khi kèo bóng đá c1 bắt đầu; nó không bao giờ thấy hoặc không được cam kết dữ liệu hoặc thay đổi đã thực hiện trong quá trình thực hiện kèo bóng đá c1 bởi kèo bóng đá c1 đồng thời. (Tuy nhiên,ChọnCó thấy các hiệu ứng của các bản cập nhật trước đó được thực hiện trong kèo bóng đá c1 riêng của nó, mặc dù chúng không chưa cam kết.) điều này khác với đọc cam kết trong đó TheChọnxem ảnh chụp nhanh như bắt đầu kèo bóng đá c1, không phải là bắt đầu truy vấn trong kèo bóng đá c1. Do đó, liên tiếpChọnCác lệnh trong một kèo bóng đá c1 duy nhất Luôn nhìn thấy cùng một dữ liệu.

Cập nhật, Xóa, Chọn cho CẬP NHẬTChọn để chia sẻCác lệnh hoạt động giống nhưChọnin Điều khoản tìm kiếm các hàng mục tiêu: Họ sẽ chỉ tìm thấy mục tiêu Các hàng đã được cam kết kể từ thời gian bắt đầu kèo bóng đá c1. Tuy nhiên, một hàng mục tiêu như vậy có thể đã được cập nhật (hoặc bị xóa hoặc bị khóa) bởi một kèo bóng đá c1 đồng thời khác của thời gian nó được tìm thấy. Trong trường hợp này, kèo bóng đá c1 có thể nối tiếp sẽ đợi kèo bóng đá c1 cập nhật đầu tiên để cam kết hoặc cuộn trở lại (nếu nó vẫn đang được tiến hành). Nếu người cập nhật đầu tiên cuộn trở lại, sau đó các hiệu ứng của nó bị phủ nhận và có thể nối tiếp kèo bóng đá c1 có thể tiến hành cập nhật hàng ban đầu được tìm thấy. Nhưng nếu người cập nhật đầu tiên cam kết (và thực sự được cập nhật hoặc đã xóa hàng, không chỉ khóa nó) sau đó có thể nối tiếp kèo bóng đá c1 sẽ được quay lại với tin nhắn

Lỗi: Không thể tuần tự hóa truy cập do cập nhật đồng thời

Vì một kèo bóng đá c1 có thể nối tiếp không thể sửa đổi hoặc khóa Hàng thay đổi bởi các kèo bóng đá c1 khác sau khi serializable kèo bóng đá c1 bắt đầu.

Khi ứng dụng nhận được thông báo lỗi này, nó nên hủy bỏ kèo bóng đá c1 hiện tại và sau đó thử lại toàn bộ kèo bóng đá c1 từ đầu. Lần thứ hai qua, kèo bóng đá c1 coi sự thay đổi cam kết trước đây là một phần của Chế độ xem ban đầu của cơ sở dữ liệu, do đó không có xung đột logic trong việc sử dụng phiên bản mới của hàng làm điểm bắt đầu cho bản cập nhật của kèo bóng đá c1 mới.

22184_22320

Chế độ có thể nối tiếp cung cấp một sự đảm bảo nghiêm ngặt Mỗi kèo bóng đá c1 thấy một cái nhìn hoàn toàn nhất quán của cơ sở dữ liệu. Tuy nhiên, ứng dụng phải được chuẩn bị để thử lại kèo bóng đá c1 khi cập nhật đồng thời làm cho không thể Duy trì ảo tưởng thực thi nối tiếp. Vì chi phí của Làm lại các kèo bóng đá c1 phức tạp có thể là đáng kể, chế độ này là Chỉ được đề xuất khi cập nhật các kèo bóng đá c1 có chứa logic đủ phức tạp để họ có thể đưa ra câu trả lời sai trong đọc Chế độ cam kết. Thông thường nhất, chế độ có thể nối tiếp là cần thiết Khi một kèo bóng đá c1 thực hiện một số lệnh liên tiếp Phải xem các chế độ xem giống hệt của cơ sở dữ liệu.

13.2.2.1. Phân kèo bóng đá c1 serializable so với khả năng nối tiếp thực sự

Ý nghĩa trực quan (và định nghĩa toán học) của"serializable"Thực thi là như vậy bất kỳ hai kèo bóng đá c1 đồng thời cam kết thành công sẽ dường như đã thực hiện nghiêm ngặt một cách nghiêm túc, một sau khác - mặc dù cái nào xuất hiện xảy ra đầu tiên có thể không được dự đoán trước. Điều quan trọng là phải nhận ra rằng cấm các hành vi không mong muốn được liệt kê trongBảng 13-123806_23886PostgreSQLs serializable cách thứcKhông đảm bảo thực thi serializable theo nghĩa này. Ví dụ, ví dụ Xem xét một bảngMyTab, ban đầu chứa

Lớp | giá trị 
-------+-------
     1 |    10
     1 |    20
     2 |   100
     2 |   200

Giả sử rằng kèo bóng đá c1 có thể nối tiếp A Tính toán

Chọn tổng (giá trị) từ mytab trong đó lớp = 1;

và sau đó chèn kết quả (30) làgiá trịTrong một hàng mới vớiclass= 2. Đồng thời, serializable kèo bóng đá c1 B tính toán

Chọn tổng (giá trị) từ mytab trong đó lớp = 2;

và thu được kết quả 300, nó chèn vào một hàng mới vớiclass= 1. Sau đó, cả hai kèo bóng đá c1 cam kết. Không có hành vi nào được liệt kê không mong muốn đã xảy ra, nhưng chúng tôi có một kết quả không thể có xảy ra theo một trong hai đơn đặt hàng. Nếu một đã được thực hiện trước đó B, B sẽ tính toán tổng 330, không phải 300 và tương tự Đơn hàng khác sẽ dẫn đến một khoản tiền khác được tính toán bởi A.

Để đảm bảo khả năng nối tiếp toán học thực sự, nó là cần thiết cho một hệ thống cơ sở dữ liệu để thực thiKhóa vị ngữ, có nghĩa là A kèo bóng đá c1 không thể chèn hoặc sửa đổi một hàng sẽ có phù hợp vớiWHEREĐiều kiện của a Truy vấn trong một kèo bóng đá c1 đồng thời khác. Ví dụ, một lần kèo bóng đá c1 A đã thực hiện truy vấnChọn ... trong đó lớp = 1, a Hệ thống khóa dự đoán sẽ cấm kèo bóng đá c1 B từ chèn bất kỳ hàng mới nào với lớp 1 cho đến khi A đã cam kết.[1]Như vậy a Hệ thống khóa rất phức tạp để thực hiện và cực kỳ đắt tiền trong việc thực hiện, vì mỗi phiên phải nhận thức được chi tiết của mọi truy vấn được thực hiện bởi mọi đồng thời kèo bóng đá c1. Và chi phí lớn này chủ yếu là lãng phí, vì Trong thực tế, hầu hết các ứng dụng không làm các loại Điều đó có thể dẫn đến vấn đề. (Chắc chắn là ví dụ trên khá giả tạo và không có khả năng đại diện cho phần mềm thực sự.) Vì những lý do này,PostgreSQLKhông thực hiện vị ngữ khóa.

Trong những trường hợp có khả năng không thể điều chỉnh được thực thi là một mối nguy hiểm thực sự, các vấn đề có thể được ngăn chặn bằng cách Sử dụng thích hợp của khóa rõ ràng. Thảo luận thêm xuất hiện trong các phần sau.

Ghi chú

[1]

Về cơ bản, một hệ thống khóa dự đoán ngăn chặn Phantom đọc bằng cách hạn chế những gì được viết, trong khi MVCC ngăn chặn chúng bằng cách hạn chế những gì được đọc.