Definition
Hoạt động tương tự như cơ chế lock (Mutex) trong việc đồng bộ hóa tiến trình (xem thêm Synchronization): cơ sở dữ liệu sẽ bị khóa lại sao cho chỉ có duy nhất 1 session được truy cập tại một thời điểm.
Giả sử session B đang cố gắng truy cập vào database mà đã bị khóa bởi session A. Session B sẽ có trạng thái là lock wait và sẽ phải chờ đến khi nào session A giải phóng khóa.
Các cơ sở dữ liệu khác nhau sẽ xử lý database locking theo các cách khác nhau:
- Một số cơ sở dữ liệu sẽ chỉ cho phép session chờ trong một khoảng thời gian timeout nhất định. Sau timeout, DBMS sẽ trả về lỗi.
- Một số khác thì cho phép session chờ vô thời hạn. Ví dụ: OracleDB.
Techniques
Database lock có thể được triển khai cho nhiều mức độ của database:
Database Level
Toàn bộ database sẽ bị khóa và chỉ có duy nhất một session được phép truy cập. Loại khóa này không thường được sử dụng nhưng vẫn hữu ích trong một số trường hợp. Một ví dụ của database level lock là chế độ độc quyền (exclusive mode) của OracleDB.
File Level
Toàn bộ một file của database sẽ bị khóa. Bên trong file đó có thể là một bảng, một phần của bảng hoặc thậm chí có thể nhiều phần của các bảng khác nhau. Do chứa nhiều loại dữ liệu nên loại khóa này cũng ít được sử dụng.
Table Level
Toàn bộ bảng sẽ bị khóa. Thường sử dụng khi thực hiện các thao tác ảnh hưởng lên toàn bộ bảng chẳng hạn như thêm hoặc xóa cột ở trong bảng (thay đổi cấu trúc bảng).
Ở trong OracleDB, đây được gọi là DDL lock bởi vì các thao tác cập nhật liên quan đến các mệnh đề DDL chẳng hạn như CREATE
, ALTER
và DROP
(xem thêm SQL).
Page or Block Level
Một block hoặc page (xem thêm paging) của database file sẽ bị khóa. Do dữ liệu lưu ở trong một page rất đa dạng nên loại khóa này ít được sử dụng.
Column Level
Một cột ở trong bảng sẽ bị khóa. Loại này rất ít được sử dụng do việc khóa và giải phóng khóa ở cấp độ cột cần sử dụng rất nhiều tài nguyên. Hầu hết các loại database không hỗ trợ loại khóa này.
Row Level
Một dòng trong bảng sẽ bị khóa. Là loại phổ biến nhất và được nhiều database hỗ trợ nhất.
Are Locks Automatically Used by Databases?
Khi dữ liệu bị xóa hoặc được cập nhật thì database locking luôn được sử dụng một cách tự động, kể cả khi người dùng database không viết câu lệnh SQL tường minh để làm điều đó.
Example of Database Locking
Xét câu truy vấn sau:
UPDATE some_table SET some_field = "some_value"
WHERE some_column = "XYZ";
Khi thực hiện câu lệnh trên, DBMS sẽ khóa các dòng có giá trị của cột some_column
là "XYZ"
để ngăn cho các session khác cùng cập nhật các dòng đó.