Khi giải quyết xung đột, bạn có hai lựa chọn:
- Bạn có thể cố gắng tránh xung đột, và đó là những gì Pessimistic Locking làm.
- Hoặc, bạn có thể cho phép xung đột xảy ra, nhưng bạn cần phát hiện ra khi thực hiện các giao dịch của mình và đó là điều mà Optimistic Locking thực hiện.
Bây giờ, hãy xem xét sự bất thường Cập nhật bị mất sau đây :
Sự bất thường của Cập nhật bị mất có thể xảy ra ở cấp độ cô lập Đọc cam kết .
Trong sơ đồ trên, chúng ta có thể thấy Alice tin rằng cô ấy có thể rút 40 từ cô ấy account
nhưng không nhận ra rằng Bob vừa thay đổi số dư tài khoản và hiện chỉ còn 20 tài khoản trong tài khoản này.
Khóa bi quan
Khóa bi quan đạt được mục tiêu này bằng cách lấy khóa chia sẻ hoặc đọc trên tài khoản để Bob không bị thay đổi tài khoản.
Trong sơ đồ trên, cả Alice và Bob sẽ có được khóa đọc trên account
hàng của bảng mà cả hai người dùng đã đọc. Cơ sở dữ liệu có được các khóa này trên SQL Server khi sử dụng Đọc lặp lại hoặc Nối tiếp.
Bởi vì cả Alice và Bob đều đã đọc account
giá trị PK của 1
, không ai trong số họ có thể thay đổi nó cho đến khi một người dùng nhả khóa đọc. Điều này là do thao tác ghi yêu cầu thu thập khóa ghi / độc quyền và khóa chia sẻ / đọc ngăn chặn khóa ghi / khóa độc quyền.
Chỉ sau khi Alice thực hiện giao dịch của mình và khóa đọc được phát hành trên account
hàng, Bob UPDATE
sẽ tiếp tục và áp dụng thay đổi. Cho đến khi Alice phát hành khóa đọc, các khối CẬP NHẬT của Bob.
Để biết thêm chi tiết về cách các khung truy cập dữ liệu sử dụng hỗ trợ khóa bi quan cơ sở dữ liệu cơ bản, hãy xem bài viết này .
Khóa lạc quan
Khóa tối ưu cho phép xảy ra xung đột nhưng phát hiện ra khi áp dụng CẬP NHẬT của Alice khi phiên bản đã thay đổi.
Lần này, chúng tôi có một version
cột bổ sung . Các version
cột được tăng lên mỗi lần một UPDATE hoặc DELETE được thực thi, và nó cũng được sử dụng trong mệnh đề WHERE của UPDATE và DELETE báo cáo. Để làm việc này, chúng ta cần phát hành CHỌN và đọc dòng điện version
trước khi thực hiện CẬP NHẬT hoặc XÓA, vì nếu không, chúng ta sẽ không biết giá trị phiên bản nào sẽ chuyển sang mệnh đề WHERE hoặc tăng dần.
Để biết thêm chi tiết về cách các khung truy cập dữ liệu thực hiện khóa tối ưu, hãy xem bài viết này .
Giao dịch cấp ứng dụng
Các hệ thống cơ sở dữ liệu quan hệ đã xuất hiện vào cuối thập niên 70 đầu thập niên 80 khi khách hàng thường kết nối với máy tính lớn thông qua thiết bị đầu cuối. Đó là lý do tại sao chúng ta vẫn thấy các hệ thống cơ sở dữ liệu xác định các thuật ngữ như cài đặt SESSION.
Ngày nay, qua Internet, chúng tôi không còn thực hiện đọc và ghi trong ngữ cảnh của cùng một giao dịch cơ sở dữ liệu và ACID không còn đủ nữa.
Ví dụ, hãy xem xét trường hợp sử dụng sau:
Nếu không có khóa lạc quan, không có cách nào Bản cập nhật bị mất này có thể bị bắt ngay cả khi các giao dịch cơ sở dữ liệu được sử dụng Nối tiếp. Điều này là do việc đọc và ghi được thực thi trong các yêu cầu HTTP riêng biệt, do đó trên các giao dịch cơ sở dữ liệu khác nhau.
Vì vậy, khóa lạc quan có thể giúp bạn ngăn chặn Cập nhật bị mất ngay cả khi sử dụng các giao dịch cấp ứng dụng kết hợp cả thời gian suy nghĩ của người dùng.
Để biết thêm chi tiết về các giao dịch cấp độ ứng dụng hoặc logic, hãy xem bài viết này .
Phần kết luận
Khóa tối ưu là một kỹ thuật rất hữu ích và nó chỉ hoạt động tốt ngay cả khi sử dụng các mức cô lập ít nghiêm ngặt hơn, như Đọc cam kết hoặc khi đọc và ghi được thực hiện trong các giao dịch cơ sở dữ liệu tiếp theo.
Nhược điểm của khóa lạc quan là việc khôi phục sẽ được kích hoạt bởi khung truy cập dữ liệu khi bắt được OptimisticLockException
, do đó mất tất cả công việc chúng tôi đã thực hiện trước đó bởi giao dịch hiện đang thực hiện.
Càng nhiều tranh chấp, càng nhiều xung đột và cơ hội hủy bỏ các giao dịch càng lớn. Rollback có thể tốn kém cho hệ thống cơ sở dữ liệu vì nó cần hoàn nguyên tất cả các thay đổi đang chờ xử lý hiện tại có thể liên quan đến cả hàng bảng và bản ghi chỉ mục.
Vì lý do này, khóa bi quan có thể là quặng phù hợp khi xung đột xảy ra thường xuyên, vì nó làm giảm cơ hội quay trở lại giao dịch.