Câu hỏi trùng lặp từ:
/programming/129329/optimistic-vs-pessimistic-locking
Sao chép / dán câu trả lời từ liên kết trên:
Khóa lạc quan là một chiến lược mà bạn đọc bản ghi, ghi lại số phiên bản và kiểm tra xem phiên bản chưa thay đổi trước khi bạn viết lại bản ghi. Khi bạn viết lại bản ghi, bạn lọc bản cập nhật trên phiên bản để đảm bảo nó là nguyên tử. (tức là chưa được cập nhật giữa khi bạn kiểm tra phiên bản và ghi bản ghi vào đĩa) và cập nhật phiên bản trong một lần nhấn.
Nếu bản ghi bị bẩn (tức là phiên bản khác với bản ghi của bạn), bạn hủy bỏ giao dịch và người dùng có thể khởi động lại nó.
Chiến lược này được áp dụng nhiều nhất cho các hệ thống khối lượng lớn và kiến trúc ba tầng mà bạn không nhất thiết phải duy trì kết nối với cơ sở dữ liệu cho phiên của mình. Trong tình huống này, máy khách thực sự không thể duy trì các khóa cơ sở dữ liệu vì các kết nối được lấy từ một nhóm và bạn không thể sử dụng cùng một kết nối từ một truy cập đến tiếp theo.
Khóa bi quan là khi bạn khóa bản ghi để sử dụng độc quyền cho đến khi bạn hoàn thành nó. Nó có tính toàn vẹn tốt hơn nhiều so với khóa lạc quan nhưng đòi hỏi bạn phải cẩn thận với thiết kế ứng dụng của mình để tránh Deadlocks. Để sử dụng khóa bi quan, bạn cần kết nối trực tiếp với cơ sở dữ liệu (thường là trong trường hợp ứng dụng máy chủ hai tầng) hoặc ID giao dịch có sẵn bên ngoài có thể được sử dụng độc lập với kết nối.
Trong trường hợp sau, bạn mở giao dịch với TxID và sau đó kết nối lại bằng ID đó. DBMS duy trì các khóa và cho phép bạn chọn phiên sao lưu thông qua TxID. Đây là cách các giao dịch phân tán sử dụng giao thức cam kết hai pha (như XA hoặc COM + Giao dịch) hoạt động.
Chỉnh sửa (Thêm thông tin để giải quyết câu hỏi về hiệu suất):
Hiệu suất khôn ngoan nó phụ thuộc vào môi trường của bạn. Lấy các yếu tố sau để quyết định:
bạn sẽ thấy lạc quan sẽ tốt hơn do đồng thời trong hầu hết các tình huống. Tuy nhiên, tùy thuộc vào RDBMS và môi trường, điều này có thể ít hoặc nhiều hiệu suất hơn. Thông thường với khóa Optimistic bạn sẽ thấy rằng giá trị cần phải được phiên bản ở đâu đó.
Ví dụ, với MS SQL Server, nó được chuyển sang TempDB và một cái gì đó trong khoảng từ 12 đến 14 byte được thêm vào cuối cột. Bật khóa tối ưu với mức cô lập như Cách ly ảnh chụp có thể gây ra sự phân mảnh và hệ số lấp đầy của bạn sẽ cần được điều chỉnh vì các hàng hiện có thêm dữ liệu ở cuối có thể khiến trang gần đầy gây ra sự phân tách trang, sẽ giảm hiệu suất của bạn. Nếu TempDB của bạn được tối ưu hóa thì điều này sẽ không nhanh như vậy.
Vì vậy, tôi đoán một danh sách kiểm tra là:
- -Bạn có đủ IO / tài nguyên để xử lý hình thức phiên bản hàng không? Nếu không, bạn đang thêm chi phí. Nếu vậy, nếu bạn đang đọc dữ liệu thường xuyên trong khi bạn thường khóa nó để ghi, bạn sẽ nhận thấy sự cải thiện tốt về đồng thời qua đọc và ghi (mặc dù ghi sẽ vẫn chặn ghi, đọc sẽ không còn chặn ghi và ngược lại)
- -Là mã của bạn dễ bị bế tắc hay bạn có bị khóa không? Nếu bạn không gặp phải các khóa dài hoặc nhiều bế tắc, thì chi phí bổ sung của khóa Lạc quan sẽ không khiến mọi thứ nhanh hơn, tất nhiên, trong hầu hết các trường hợp chúng ta đang nói chuyện một phần nghìn giây ở đây.
- -Nếu DB của bạn lớn (hoặc trên phần cứng rất hạn chế) và các trang dữ liệu của bạn đã gần đầy, tùy thuộc vào RDBMS, bạn có thể gây ra sự phân tách trang lớn và phân mảnh dữ liệu, vì vậy hãy đảm bảo xem xét việc lập lại sau khi bật.
Đó là những suy nghĩ của tôi về vấn đề này, mở để nghe nhiều hơn từ cộng đồng.