Như brb tea nói, phụ thuộc vào việc triển khai cơ sở dữ liệu và thuật toán mà họ sử dụng: MVCC hoặc Two Phase Lock.
CUBRID (RDBMS mã nguồn mở) giải thích ý tưởng của hai thuật toán này:
Đầu tiên là khi giao dịch T2 cố gắng thay đổi bản ghi A, nó biết rằng giao dịch T1 đã thay đổi bản ghi A và đợi cho đến khi giao dịch T1 hoàn thành vì giao dịch T2 không thể biết liệu giao dịch T1 sẽ được cam kết hay cuộn trở lại. Phương pháp này được gọi là khóa hai pha (2PL).
- Kiểm soát đồng thời nhiều phiên bản (MVCC)
Phương thức còn lại là cho phép mỗi giao dịch T1 và T2 có phiên bản thay đổi của riêng chúng. Ngay cả khi giao dịch T1 đã thay đổi bản ghi A từ 1 thành 2, giao dịch T1 vẫn giữ nguyên giá trị ban đầu là 1 và ghi rằng phiên bản giao dịch T1 của bản ghi A là 2. Sau đó, giao dịch T2 sau thay đổi bản ghi A. từ 1 đến 3, không phải từ 2 đến 4 và viết rằng phiên bản giao dịch T2 của bản ghi A là 3.
Khi giao dịch T1 được quay trở lại, không có vấn đề gì nếu phiên bản giao dịch 2, T1, không được áp dụng cho bản ghi A. Sau đó, nếu giao dịch T2 được cam kết, phiên bản giao dịch 3, T2, sẽ được áp dụng cho bản ghi A. Nếu giao dịch T1 được cam kết trước giao dịch T2, bản ghi A được thay đổi thành 2 và sau đó thành 3 tại thời điểm thực hiện giao dịch T2. Trạng thái cơ sở dữ liệu cuối cùng giống với trạng thái thực hiện từng giao dịch một cách độc lập, không có bất kỳ ảnh hưởng nào đến các giao dịch khác. Do đó, nó thỏa mãn thuộc tính ACID. Phương pháp này được gọi là điều khiển đồng thời nhiều phiên bản (MVCC).
MVCC cho phép sửa đổi đồng thời với chi phí tăng thêm chi phí trong bộ nhớ (vì nó phải duy trì các phiên bản khác nhau của cùng một dữ liệu) và tính toán (ở cấp REPETEABLE_READ, bạn không thể mất cập nhật nên nó phải kiểm tra các phiên bản của dữ liệu, chẳng hạn như Hiberate với Khóa Optimistick ).
Trong 2PL Mức cách ly giao dịch kiểm soát những điều sau :
Khóa có được sử dụng khi dữ liệu được đọc hay không và loại khóa được yêu cầu.
Khóa đọc được giữ trong bao lâu.
Liệu một hoạt động đọc tham chiếu đến các hàng được sửa đổi bởi một giao dịch khác:
Chặn cho đến khi khóa riêng trên hàng được giải phóng.
Truy xuất phiên bản đã cam kết của hàng tồn tại tại thời điểm bắt đầu sao kê hoặc giao dịch.
Đọc sửa đổi dữ liệu không cam kết.
Việc chọn mức cách ly giao dịch không ảnh hưởng đến các khóa có được để bảo vệ các sửa đổi dữ liệu. Một giao dịch luôn có một khóa độc quyền đối với bất kỳ dữ liệu nào mà nó sửa đổi và giữ khóa đó cho đến khi giao dịch hoàn tất, bất kể mức độ cách ly được đặt cho giao dịch đó là gì. Đối với hoạt động đọc, các mức cách ly giao dịch chủ yếu xác định mức độ bảo vệ khỏi tác động của các sửa đổi được thực hiện bởi các giao dịch khác.
Mức cô lập thấp hơn sẽ làm tăng khả năng nhiều người dùng truy cập dữ liệu cùng một lúc, nhưng làm tăng số lượng các tác động đồng thời , chẳng hạn như đọc bẩn hoặc cập nhật bị mất mà người dùng có thể gặp phải.
Ví dụ cụ thể về mối quan hệ giữa khóa và mức cách ly trong SQL Server (sử dụng 2PL ngoại trừ trên READ_COMMITED với READ_COMMITTED_SNAPSHOT = ON)
READ_UNCOMMITED: không phát hành khóa dùng chung để ngăn các giao dịch khác sửa đổi dữ liệu được đọc bởi giao dịch hiện tại. READ UNCOMMITTED giao dịch cũng không bị chặn bởi các khóa độc quyền sẽ ngăn giao dịch hiện tại đọc các hàng đã được sửa đổi nhưng không được cam kết bởi các giao dịch khác. [...]
READ_COMMITED:
- Nếu READ_COMMITTED_SNAPSHOT được đặt thành TẮT (mặc định): sử dụng khóa chia sẻ để ngăn các giao dịch khác sửa đổi hàng trong khi giao dịch hiện tại đang chạy thao tác đọc. Các khóa chia sẻ cũng chặn câu lệnh đọc các hàng được sửa đổi bởi các giao dịch khác cho đến khi giao dịch khác được hoàn thành. [...] Khóa hàng được giải phóng trước khi hàng tiếp theo được xử lý. [...]
- Nếu READ_COMMITTED_SNAPSHOT được đặt thành BẬT, Công cụ cơ sở dữ liệu sử dụng lập phiên bản hàng để trình bày từng câu lệnh với ảnh chụp nhanh dữ liệu nhất quán về giao dịch như nó tồn tại ở đầu câu lệnh. Khóa không được sử dụng để bảo vệ dữ liệu khỏi các cập nhật bởi các giao dịch khác.
REPETEABLE_READ: Các khóa dùng chung được đặt trên tất cả dữ liệu được đọc bởi mỗi câu lệnh trong giao dịch và được giữ cho đến khi giao dịch hoàn tất.
SERIALIZABLE: Khóa phạm vi được đặt trong phạm vi giá trị khóa phù hợp với điều kiện tìm kiếm của mỗi câu lệnh được thực hiện trong một giao dịch. [...] Các khóa phạm vi được giữ cho đến khi giao dịch hoàn tất.