Dưới đây là báo cáo kết quả bằng văn bản của Wikipedia's Isolation article về REPEATABLE READS
Một số giải thích về mức độ cách ly khác nhau trong giao dịch cơ sở dữ liệu?
Trong mức cô lập này, một khóa dựa trên đồng thời thực hiện DBMS kiểm soát tiếp tục đọc và ghi ổ khóa (mua vào dữ liệu được chọn) cho đến khi kết thúc giao dịch. Tuy nhiên, phạm vi khóa không được quản lý, do đó hiện tượng đọc bóng ma có thể xảy ra (xem bên dưới).
Câu hỏi của tôi ở đây là khi nào giao dịch bắt đầu và kết thúc tương ứng.
Nếu chúng ta lấy ví dụ về không lặp lại đọc với REPEATABLE READS mức Isolation tại liên kết cùng, theo hiểu biết của tôi trnsaction 1 bắt đầu khi truy vấn đầu tiên là bắn tức SELECT * FROM users WHERE id = 1.
DBMS sẽ giữ khóa trên bảng người sử dụng cho đến khi và trừ khi giao dịch kết thúc. tại đây Vào cuối Ý tôi là khi kết nối được khôi phục hoặc cam kết không hoàn thành SELECT * FROM users WHERE id = 1
. Đến thời điểm đó Giao dịch 2 sẽ đợi phải không?
Câu hỏi 2: - Bây giờ nếu chúng ta xem xét mức độ cô lập và hành vi của họ như được đưa ra dưới đây (tại liên kết cùng)
Isolation level Dirty reads Non-repeatable Phantoms
Read Uncommitted may occur may occur may occur
Read Committed - may occur may occur
Repeatable Read - may occur -
Serializable - - -
Theo hiểu biết của tôi đáng tin cậy nhất là Serializable sau đó lặp Đọc và sau đó Đọc Cam kết nhưng tôi vẫn thấy các ứng dụng sử dụng Read Committed. Đó có phải là vì hiệu năng đọc có thể lặp lại và lặp lại là không tốt so với Đọc cam kết vì trong tuần tự nó sẽ được tuần tự và trong trường hợp giao dịch khác phải đợi để phát hành khóa bằng giao dịch khác. Phải không? Vì vậy, để có được tốt nhất của cả ba chúng tôi có thể sử dụng cách ly mức độ như đã đọc Cam kết với SELECT FOR UPDATE
(để đạt được đọc lặp lại). Bạn không chắc chắn cách chúng ta có thể đạt được ma đọc nếu chúng ta muốn, trong trường hợp đọc cam kết mức cô lập?
Xem http://stackoverflow.com/questions/10935850/when -to-use-select-for-update cho một cuộc thảo luận về 'CHỌN ... CHO CẬP NHẬT ' – Gili
Vì vậy, để có được tốt nhất trong cả ba chúng ta có thể sử dụng mức cô lập như Read Committed với SELECT FOR UPDATE - đây là cách tiếp cận của các lớp kiên trì JDO như Datanucleus. Họ cung cấp một cơ chế để kiểm soát "SELECT FOR UPDATE" trên cơ sở mỗi giao dịch. Tôi tin rằng cách tiếp cận này sẽ mang lại lợi ích của cơ chế khóa giao dịch Serializable khi sử dụng các loại giao dịch "thấp hơn". – marcolopes
Bạn có chắc chắn rằng "Đọc lặp lại" có thể xảy ra trong giao dịch với mức cô lập "Không lặp lại" không? Trong bài viết này, bảng khác - http://www.oracle.com/technetwork/issue-archive/2010/10-jan/o65asktom-082389.html – naXa