Tóm tắt
Dùng LOCK TABLES để khóa nhiều bảng cùng lúc (READ hoặc WRITE). Lock không an toàn cho transaction – nó commit transaction đang hoạt động trước khi khóa bảng tiếp theo.
Cú pháp
LOCK TABLES bang1 WRITE, bang2 WRITE, bang3 READ, ...;
-- Hoặc từng lệnh:
LOCK TABLES bang1 WRITE;
LOCK TABLES bang2 WRITE;
-- ...
UNLOCK TABLES; -- Giải phóng tất cả
Ví dụ
CREATE TABLE OrderDemo (OrderId INT NOT NULL AUTO_INCREMENT PRIMARY KEY, OrderPrice INT, OrderDatetime DATETIME);
-- Giả sử bảng utfdemo đã tồn tại
LOCK TABLES OrderDemo WRITE;
LOCK TABLES utfdemo WRITE;
-- Bây giờ session này nắm lock WRITE trên cả hai bảng
Hành vi khi đã lock
- Session khác đọc/ghi các bảng bị khóa WRITE sẽ chờ (block).
- Session hiện tại **không thể** tạo bảng mới, truy cập bảng chưa khóa – báo lỗi
ERROR 1100 (HY000): Table '...' was not locked with LOCK TABLES. - Phải
UNLOCK TABLEShoặc kết thúc session để giải phóng.
Lưu ý quan trọng
- Không dùng cho transaction – LOCK TABLES commit ngầm transaction hiện tại.
- Thay vào đó dùng
SELECT ... FOR UPDATE/LOCK IN SHARE MODEtrong transaction (InnoDB). - Chỉ dùng LOCK TABLES cho: backup logic, migration, maintenance, MyISAM.
- Deadlock có thể xảy ra nếu nhiều session lock thứ tự khác nhau – luôn lock theo thứ tự tên bảng cố định.