Khóa ghi (WRITE LOCK) trong MySQL là một cơ chế quản lý đồng thời cho phép một giao dịch thực hiện thao tác ghi trên một tài nguyên (bảng hoặc dòng) và ngăn chặn tất cả các giao dịch khác thực hiện thao tác ghi hoặc đọc trên tài nguyên đó cho đến khi khóa được giải phóng. Đây là một phần quan trọng trong việc đảm bảo tính toàn vẹn và nhất quán của dữ liệu trong cơ sở dữ liệu.

1. Cách hoạt động của Khóa Ghi (WRITE LOCK)

Khi một giao dịch đặt khóa ghi trên một bảng, nó sẽ:

  • Ngăn chặn tất cả các giao dịch khác thực hiện thao tác ghi: Các giao dịch ghi khác sẽ bị chặn cho đến khi khóa ghi được giải phóng.
  • Ngăn chặn các giao dịch đọc nếu có khóa ghi đang hoạt động: Các giao dịch đọc sẽ phải chờ cho đến khi khóa ghi được giải phóng.

Ví dụ:

Giả sử bạn có một bảng tên là products và bạn thực hiện thao tác khóa ghi như sau:

LOCK TABLES products WRITE;

Khi khóa ghi được áp dụng:

  • Giao dịch ghi sẽ được thực hiện:
    • INSERT INTO products (name, price) VALUES ('Product A', 100);
    • UPDATE products SET price = 150 WHERE id = 1;
    • DELETE FROM products WHERE id = 2;
  • Tất cả các giao dịch khác sẽ bị chặn:
    • Nếu có một giao dịch khác cố gắng thực hiện SELECT * FROM products;, nó sẽ phải chờ cho đến khi khóa ghi được giải phóng.
    • Tương tự, các giao dịch ghi khác cũng sẽ phải chờ.

Để giải phóng khóa ghi, bạn có thể sử dụng lệnh sau:

UNLOCK TABLES;

2. Khóa Ghi trong Ngữ cảnh Giao dịch (Transaction Context)

Trong các hệ quản trị cơ sở dữ liệu như InnoDB, bạn có thể không cần phải sử dụng LOCK TABLES mà vẫn có thể áp dụng khóa ghi thông qua các thao tác giao dịch:

  • Ví dụ sử dụng giao dịch:
START TRANSACTION;
UPDATE products SET price = 120 WHERE id = 1;  -- Khóa ghi tự động được áp dụng
-- Các thao tác khác ở đây
COMMIT;  -- Khóa ghi sẽ được giải phóng khi giao dịch được hoàn thành

3. Tại sao Khóa Ghi quan trọng?

  • Đảm bảo tính toàn vẹn dữ liệu: Khóa ghi ngăn chặn các giao dịch khác can thiệp vào dữ liệu trong quá trình thực hiện, từ đó giảm thiểu rủi ro xảy ra các tình huống không mong muốn như cập nhật bị mất (lost updates) hoặc đọc dữ liệu không nhất quán.
  • Hỗ trợ cho các ứng dụng ghi dữ liệu: Trong các ứng dụng mà thao tác ghi thường xuyên hơn đọc, khóa ghi giúp đảm bảo rằng dữ liệu được cập nhật chính xác và đồng bộ.
  • Ngăn ngừa deadlock: Việc sử dụng khóa ghi hợp lý có thể giúp hạn chế khả năng xảy ra deadlock, nơi hai giao dịch chờ nhau và không thể hoàn thành.

4. Tình huống Deadlock

Trong một số trường hợp, nếu nhiều giao dịch cố gắng khóa cùng một tài nguyên theo thứ tự khác nhau, điều này có thể dẫn đến deadlock. MySQL sẽ tự động phát hiện và giải quyết deadlock bằng cách hủy bỏ một trong các giao dịch để giải phóng khóa.

Kết luận

Khóa ghi (WRITE LOCK) là một phần quan trọng trong việc quản lý đồng thời trong MySQL, cho phép bảo vệ tính toàn vẹn của dữ liệu khi nhiều giao dịch thực hiện thao tác ghi. Bằng cách ngăn chặn các giao dịch khác thực hiện thao tác ghi hoặc đọc, khóa ghi đảm bảo rằng dữ liệu luôn nhất quán và chính xác trong suốt quá trình xử lý.