Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Khóa nhiều bảng trong MySQL với LOCK TABLES

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 TABLES hoặ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 MODE trong 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.