Từ Wikipedia (có các ví dụ chi tiết và tuyệt vời cho việc này):
Việc đọc không lặp lại xảy ra khi trong quá trình giao dịch, một hàng được truy xuất hai lần và các giá trị trong hàng khác nhau giữa các lần đọc.
và
Đọc ảo xảy ra khi, trong quá trình giao dịch, hai truy vấn giống hệt nhau được thực thi và tập hợp các hàng được trả về bởi truy vấn thứ hai khác với truy vấn đầu tiên.
Ví dụ đơn giản:
- Người dùng A chạy cùng một truy vấn hai lần.
- Ở giữa, Người dùng B chạy một giao dịch và cam kết.
- Đọc không lặp lại:Hàng mà người dùng A đã truy vấn có giá trị khác ở lần thứ hai.
- Ma đọc:Tất cả các hàng trong truy vấn có cùng giá trị trước và sau, nhưng các hàng khác nhau đang được chọn (vì B đã xóa hoặc chèn một số). Ví dụ:
select sum(x) from table;
sẽ trả về một kết quả khác ngay cả khi không có hàng nào trong số các hàng bị ảnh hưởng được cập nhật, nếu các hàng đã được thêm hoặc bị xóa.
Trong ví dụ trên, mức cách ly nào sẽ được sử dụng?
Mức độ cách ly nào bạn cần tùy thuộc vào ứng dụng của bạn. Có một mức chi phí cao đối với mức cô lập "tốt hơn" (chẳng hạn như giảm tính đồng thời).
Trong ví dụ của bạn, bạn sẽ không có phép đọc ảo, vì bạn chỉ chọn từ một hàng duy nhất (được xác định bằng khóa chính). Bạn có thể có các lần đọc không lặp lại, vì vậy nếu đó là vấn đề, bạn có thể muốn có một mức cách ly để ngăn điều đó. Trong Oracle, giao dịch A cũng có thể đưa ra một LỰA CHỌN ĐỂ CẬP NHẬT, sau đó giao dịch B không thể thay đổi hàng cho đến khi A hoàn tất.