Hm, hãy liệt kê tất cả các trường hợp.
REQUIRES_NEW
không thực sự tổ chức các giao dịch, nhưng như bạn đã đề cập tạm dừng giao dịch hiện tại. Sau đó, chỉ có hai giao dịch truy cập cùng một thông tin. (Điều này tương tự như hai giao dịch đồng thời thông thường, ngoại trừ việc chúng không đồng thời nhưng trong cùng một luồng thực thi).
T1 T2 T1 T2
― ―
| |
|
― | ―
| | |
| = | |
― | ―
|
| |
― ―
Sau đó chúng ta cần phải xem xét lạc vs bi quan khóa.
Ngoài ra, chúng tôi cần xem xét tuôn ra do ORM vận hành. Với ORM, chúng tôi không có quyền kiểm soát rõ ràng khi ghi xảy ra, vì flush
được kiểm soát bởi khung. Thông thường, một lệnh tuôn ra ngầm xảy ra trước cam kết, nhưng nếu nhiều mục được sửa đổi, khung làm việc cũng có thể làm các phép bung trung gian.
1) Hãy xem xét khóa lạc quan, nơi đọc không có khóa, nhưng viết có được khóa độc quyền.
Đọc bởi T1 không có khóa.
1a) Nếu T1 đã tuôn ra các thay đổi sớm, nó sẽ có khóa độc quyền. Khi T2 cam kết, nó cố gắng để có được khóa nhưng không thể. Hệ thống bị chặn. Điều này có thể là một loại bế tắc cụ thể. Hoàn thành phụ thuộc vào cách giao dịch hoặc khóa thời gian.
1b) Nếu T1 không tuôn ra các thay đổi sớm, không có khóa đã được mua. Khi T2 cam kết, nó mua lại và phát hành nó và thành công. Khi T1 cố gắng cam kết, nó sẽ thông báo xung đột và thất bại.
2) Hãy xem xét khóa bi quan, nơi đọc có được khóa chia sẻ và viết khóa độc quyền.
Đọc bởi T1 có khóa chia sẻ.
2a) Nếu T1 bị tuôn ra sớm, nó sẽ khóa khóa inta một khóa độc quyền. Tình hình là tương tự như 1a)
2b) Nếu T1 không tuôn ra sớm, T1 giữ khóa chia sẻ. Khi T2 cam kết, nó cố gắng để có được một khóa và khối độc quyền. Hệ thống bị chặn lại.
Kết luận: tốt với khóa lạc quan nếu không có sự tuôn ra sớm xảy ra, bạn không thể kiểm soát chặt chẽ.
Bạn nhận được bế tắc ở đâu và ở đâu? Từ bộ nhớ cache phiên hoặc từ các hàng bị khóa cơ sở dữ liệu? –