2011-09-14 32 views
5

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 READSMộ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?

+0

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

+0

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

+0

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

Trả lời

6

Oracle không hỗ trợ mức cách ly REPEATABLE READ. Tuy nhiên, SQL Server không - và nó đặt ổ khóa trên tất cả các hàng được lựa chọn bởi giao dịch cho đến khi nó kết thúc (tức là: nó được cam kết hoặc cuộn lại). Vì vậy, bạn là chính xác, điều này thực sự sẽ làm cho các giao dịch khác chờ đợi (nếu họ đang cập nhật dữ liệu bị khóa) và có thể gây bất lợi cho đồng thời.

Đối với câu hỏi 2: Có, cấp độ cách ly càng cao, giao dịch đồng thời của bạn sẽ càng tồi tệ vì chúng phải đợi nhiều khóa hơn sẽ được giải phóng. Tôi không chắc chắn ý của bạn là gì bằng cách "tận dụng tối đa cả ba" bằng cách sử dụng SELECT FOR UPDATESELECT FOR UPDATE sẽ đặt khóa hàng trên tất cả các hàng đã chọn.

Và cuối cùng, đây là một trích dẫn từ thủ công của Oracle trên phantom đọc:

[phantom đọc xảy ra khi] một giao dịch chiếu lại một truy vấn trả về một tập hợp các hàng thỏa mãn một điều kiện tìm kiếm và phát hiện ra rằng một giao dịch cam kết đã chèn các hàng bổ sung thỏa mãn điều kiện.

Ví dụ: giao dịch truy vấn số lượng nhân viên.Năm phút sau nó thực hiện cùng một truy vấn, nhưng bây giờ số lượng đã tăng lên bởi vì một người dùng khác đã chèn một bản ghi cho một thuê mới. Nhiều dữ liệu hơn đáp ứng các tiêu chí truy vấn so với trước đây, nhưng không giống như trong một mờ đọc dữ liệu đọc trước đó là không thay đổi.


tham khảo:

+0

"Tôi không chắc chắn ý bạn là gì" bằng cách tận dụng tối đa tất cả ba "Về cơ bản những gì tôi đang cố gắng hỏi ở đây là nếu chúng ta sử dụng mức độ cô lập đã đọc trong oracle, chúng ta sẽ vẫn nhận được cả hai vấn đề không lặp lại và ma. Đọc theo ý của tôi trước hết chúng ta không nên gọi chúng là vấn đề nhưng đây nên được coi là hành vi đúng vì vì ở giữa giao dịch đầu tiên nếu giao dịch thứ hai cam kết thì chúng ta sẽ nhận dữ liệu cập nhật.Điều tiếp theo ... –

+1

tiếp tục ... Câu hỏi thứ hai là nếu chúng ta muốn tránh các vấn đề đọc không lặp lại và ma với đọc cam kết trên oracle, là có cách nào? Theo tôi nếu chúng ta sử dụng lựa chọn cho truy vấn cập nhật chúng ta có thể được lưu từ đọc không lặp lại .Coorect? Nhưng không chắc chắn làm thế nào chúng ta có thể tránh ma đọc? –

Các vấn đề liên quan