Hướng dẫn mysql workbench commit - cam kết bàn làm việc mysql

13.3.6 & nbsp; bảng khóa và câu lệnh bảng mở khóa

LOCK TABLES
    tbl_name [[AS] alias] lock_type
    [, tbl_name [[AS] alias] lock_type] ...

lock_type: {
    READ [LOCAL]
  | [LOW_PRIORITY] WRITE
}

UNLOCK TABLES

MySQL cho phép các phiên khách có được khóa bảng một cách rõ ràng cho mục đích hợp tác với các phiên khác để truy cập vào bảng hoặc để ngăn các phiên khác sửa đổi các bảng trong các giai đoạn khi phiên yêu cầu quyền truy cập độc quyền vào chúng. Một phiên có thể có được hoặc phát hành khóa chỉ cho chính nó. Một phiên không thể có được khóa cho phiên khác hoặc khóa phát hành do phiên khác nắm giữ.

Khóa có thể được sử dụng để mô phỏng các giao dịch hoặc để có thêm tốc độ khi cập nhật các bảng. Điều này được giải thích chi tiết hơn trong các hạn chế và điều kiện khóa bàn.

mysql> LOCK TABLES t1 READ;
mysql> SELECT COUNT(*) FROM t1;
+----------+
| COUNT(*) |
+----------+
|        3 |
+----------+
mysql> SELECT COUNT(*) FROM t2;
ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES
1 có được một cách rõ ràng khóa bảng cho phiên khách hàng hiện tại. Khóa bàn có thể được thu thập cho các bảng cơ sở hoặc chế độ xem. Bạn phải có đặc quyền
mysql> LOCK TABLES t1 READ;
mysql> SELECT COUNT(*) FROM t1;
+----------+
| COUNT(*) |
+----------+
|        3 |
+----------+
mysql> SELECT COUNT(*) FROM t2;
ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES
1 và đặc quyền
mysql> LOCK TABLES t1 READ;
mysql> SELECT COUNT(*) FROM t1;
+----------+
| COUNT(*) |
+----------+
|        3 |
+----------+
mysql> SELECT COUNT(*) FROM t2;
ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES
3 cho mỗi đối tượng bị khóa.

Để khóa xem,

mysql> LOCK TABLES t1 READ;
mysql> SELECT COUNT(*) FROM t1;
+----------+
| COUNT(*) |
+----------+
|        3 |
+----------+
mysql> SELECT COUNT(*) FROM t2;
ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES
1 sẽ thêm tất cả các bảng cơ sở được sử dụng trong chế độ xem vào tập hợp các bảng để được khóa và khóa chúng tự động. Đối với các bảng nằm dưới mọi chế độ xem đang bị khóa,
mysql> LOCK TABLES t1 READ;
mysql> SELECT COUNT(*) FROM t1;
+----------+
| COUNT(*) |
+----------+
|        3 |
+----------+
mysql> SELECT COUNT(*) FROM t2;
ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES
1 kiểm tra xem Chế độ xem Definer (đối với các lượt xem
mysql> LOCK TABLES t1 READ;
mysql> SELECT COUNT(*) FROM t1;
+----------+
| COUNT(*) |
+----------+
|        3 |
+----------+
mysql> SELECT COUNT(*) FROM t2;
ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES
6) hoặc Invoker (đối với tất cả các chế độ xem) có các đặc quyền thích hợp trên các bảng.

Nếu bạn khóa một bảng một cách rõ ràng với

mysql> LOCK TABLES t1 READ;
mysql> SELECT COUNT(*) FROM t1;
+----------+
| COUNT(*) |
+----------+
|        3 |
+----------+
mysql> SELECT COUNT(*) FROM t2;
ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES
7, bất kỳ bảng nào được sử dụng trong các kích hoạt cũng bị khóa ngầm, như được mô tả trong các bảng khóa và bộ kích hoạt.

Nếu bạn khóa một bảng một cách rõ ràng với

mysql> LOCK TABLES t1 READ;
mysql> SELECT COUNT(*) FROM t1;
+----------+
| COUNT(*) |
+----------+
|        3 |
+----------+
mysql> SELECT COUNT(*) FROM t2;
ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES
7, bất kỳ bảng nào liên quan đến ràng buộc khóa nước ngoài sẽ được mở và khóa ngầm. Đối với kiểm tra khóa nước ngoài, khóa chỉ đọc được chia sẻ (
mysql> LOCK TABLES t1 READ;
mysql> SELECT COUNT(*) FROM t1;
+----------+
| COUNT(*) |
+----------+
|        3 |
+----------+
mysql> SELECT COUNT(*) FROM t2;
ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES
9) được thực hiện trên các bảng liên quan. Đối với các bản cập nhật xếp tầng, khóa ghi không chia sẻ (
mysql> LOCK TABLE t WRITE, t AS t1 READ;
mysql> INSERT INTO t SELECT * FROM t;
ERROR 1100: Table 't' was not locked with LOCK TABLES
mysql> INSERT INTO t SELECT * FROM t AS t1;
0) được thực hiện trên các bảng liên quan có liên quan đến hoạt động.

mysql> LOCK TABLE t WRITE, t AS t1 READ;
mysql> INSERT INTO t SELECT * FROM t;
ERROR 1100: Table 't' was not locked with LOCK TABLES
mysql> INSERT INTO t SELECT * FROM t AS t1;
1 phát hành rõ ràng bất kỳ khóa bảng nào được tổ chức bởi phiên hiện tại.
mysql> LOCK TABLES t1 READ;
mysql> SELECT COUNT(*) FROM t1;
+----------+
| COUNT(*) |
+----------+
|        3 |
+----------+
mysql> SELECT COUNT(*) FROM t2;
ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES
1 ngầm phát hành bất kỳ khóa bảng nào được tổ chức bởi phiên hiện tại trước khi có được ổ khóa mới.

Một cách sử dụng khác cho

mysql> LOCK TABLE t WRITE, t AS t1 READ;
mysql> INSERT INTO t SELECT * FROM t;
ERROR 1100: Table 't' was not locked with LOCK TABLES
mysql> INSERT INTO t SELECT * FROM t AS t1;
1 là phát hành Khóa đọc toàn cầu có được với câu lệnh
mysql> LOCK TABLE t WRITE, t AS t1 READ;
mysql> INSERT INTO t SELECT * FROM t;
ERROR 1100: Table 't' was not locked with LOCK TABLES
mysql> INSERT INTO t SELECT * FROM t AS t1;
4, cho phép bạn khóa tất cả các bảng trong tất cả các cơ sở dữ liệu. Xem Phần & NBSP; 13.7.8.3, Tuyên bố tuôn ra. (Đây là một cách rất thuận tiện để có được bản sao lưu nếu bạn có một hệ thống tệp như Veritas có thể chụp nhanh kịp thời.)

Một khóa bảng chỉ bảo vệ chống lại các lần đọc hoặc ghi không phù hợp bởi các phiên khác. Một phiên giữ khóa

mysql> LOCK TABLE t WRITE, t AS t1 READ;
mysql> INSERT INTO t SELECT * FROM t;
ERROR 1100: Table 't' was not locked with LOCK TABLES
mysql> INSERT INTO t SELECT * FROM t AS t1;
5 có thể thực hiện các hoạt động cấp bảng như
mysql> LOCK TABLE t WRITE, t AS t1 READ;
mysql> INSERT INTO t SELECT * FROM t;
ERROR 1100: Table 't' was not locked with LOCK TABLES
mysql> INSERT INTO t SELECT * FROM t AS t1;
6 hoặc
mysql> LOCK TABLE t WRITE, t AS t1 READ;
mysql> INSERT INTO t SELECT * FROM t;
ERROR 1100: Table 't' was not locked with LOCK TABLES
mysql> INSERT INTO t SELECT * FROM t AS t1;
7. Đối với các phiên giữ khóa
mysql> LOCK TABLE t WRITE, t AS t1 READ;
mysql> INSERT INTO t SELECT * FROM t;
ERROR 1100: Table 't' was not locked with LOCK TABLES
mysql> INSERT INTO t SELECT * FROM t AS t1;
8, các hoạt động
mysql> LOCK TABLE t WRITE, t AS t1 READ;
mysql> INSERT INTO t SELECT * FROM t;
ERROR 1100: Table 't' was not locked with LOCK TABLES
mysql> INSERT INTO t SELECT * FROM t AS t1;
9 và
mysql> LOCK TABLE t WRITE, t AS t1 READ;
mysql> INSERT INTO t SELECT * FROM t;
ERROR 1100: Table 't' was not locked with LOCK TABLES
mysql> INSERT INTO t SELECT * FROM t AS t1;
7 không được phép.

Các cuộc thảo luận sau đây chỉ áp dụng cho các bảng không phải là không.

mysql> LOCK TABLES t1 READ;
mysql> SELECT COUNT(*) FROM t1;
+----------+
| COUNT(*) |
+----------+
|        3 |
+----------+
mysql> SELECT COUNT(*) FROM t2;
ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES
7 được phép (nhưng bị bỏ qua) cho bảng
mysql> LOCK TABLE t READ;
mysql> SELECT * FROM t AS myalias;
ERROR 1100: Table 'myalias' was not locked with LOCK TABLES
1. Bảng có thể được truy cập tự do bởi phiên trong đó nó được tạo, bất kể khóa nào khác có thể có hiệu lực. Không cần khóa là không cần thiết vì không có phiên nào khác có thể xem bảng.

  • Mua lại khóa bảng

  • Phát hành khóa bảng

  • Tương tác của khóa bảng và giao dịch

  • Khóa bảng và kích hoạt

  • Các hạn chế và điều kiện khóa bàn

Mua lại khóa bảng

Phát hành khóa bảng

Tương tác của khóa bảng và giao dịch

Khóa bảng và kích hoạt

  • Các hạn chế và điều kiện khóa bàn

  • Để có được các khóa bảng trong phiên hiện tại, hãy sử dụng câu lệnh

    mysql> LOCK TABLES t1 READ;
    mysql> SELECT COUNT(*) FROM t1;
    +----------+
    | COUNT(*) |
    +----------+
    |        3 |
    +----------+
    mysql> SELECT COUNT(*) FROM t2;
    ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES
    1, thu được khóa siêu dữ liệu (xem Phần & NBSP; 8.11.4, khóa siêu dữ liệu khóa).

  • Các loại khóa sau có sẵn:

  • mysql> LOCK TABLE t READ;
    mysql> SELECT * FROM t AS myalias;
    ERROR 1100: Table 'myalias' was not locked with LOCK TABLES
    5 khóa:

Phiên giữ khóa có thể đọc bảng (nhưng không viết nó).

  • Nhiều phiên có thể có được khóa

    mysql> LOCK TABLE t WRITE, t AS t1 READ;
    mysql> INSERT INTO t SELECT * FROM t;
    ERROR 1100: Table 't' was not locked with LOCK TABLES
    mysql> INSERT INTO t SELECT * FROM t AS t1;
    8 cho bảng cùng một lúc.

  • Các phiên khác có thể đọc bảng mà không cần có khóa

    mysql> LOCK TABLE t WRITE, t AS t1 READ;
    mysql> INSERT INTO t SELECT * FROM t;
    ERROR 1100: Table 't' was not locked with LOCK TABLES
    mysql> INSERT INTO t SELECT * FROM t AS t1;
    8.

  • Trình sửa đổi

    mysql> LOCK TABLE t READ;
    mysql> SELECT * FROM t AS myalias;
    ERROR 1100: Table 'myalias' was not locked with LOCK TABLES
    8 cho phép các câu lệnh
    mysql> LOCK TABLE t READ;
    mysql> SELECT * FROM t AS myalias;
    ERROR 1100: Table 'myalias' was not locked with LOCK TABLES
    9 không liên tục (chèn đồng thời) bởi các phiên khác để thực thi trong khi khóa được giữ. . Đối với các bảng
    mysql> LOCK TABLE t AS myalias READ;
    mysql> SELECT * FROM t;
    ERROR 1100: Table 't' was not locked with LOCK TABLES
    mysql> SELECT * FROM t AS myalias;
    1,
    mysql> LOCK TABLE t AS myalias READ;
    mysql> SELECT * FROM t;
    ERROR 1100: Table 't' was not locked with LOCK TABLES
    mysql> SELECT * FROM t AS myalias;
    2 giống như
    mysql> LOCK TABLE t WRITE, t AS t1 READ;
    mysql> INSERT INTO t SELECT * FROM t;
    ERROR 1100: Table 't' was not locked with LOCK TABLES
    mysql> INSERT INTO t SELECT * FROM t AS t1;
    8.

  • mysql> LOCK TABLE t AS myalias READ;
    mysql> SELECT * FROM t;
    ERROR 1100: Table 't' was not locked with LOCK TABLES
    mysql> SELECT * FROM t AS myalias;
    4 khóa:

Phiên giữ khóa có thể đọc và viết bảng.

Nếu câu lệnh

mysql> LOCK TABLES t1 READ;
mysql> SELECT COUNT(*) FROM t1;
+----------+
| COUNT(*) |
+----------+
|        3 |
+----------+
mysql> SELECT COUNT(*) FROM t2;
ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES
1 phải chờ do khóa được giữ bởi các phiên khác trên bất kỳ bảng nào, nó sẽ chặn cho đến khi tất cả các khóa có thể được thu thập.

Một phiên yêu cầu khóa phải có được tất cả các khóa mà nó cần trong một câu lệnh

mysql> LOCK TABLES t1 READ;
mysql> SELECT COUNT(*) FROM t1;
+----------+
| COUNT(*) |
+----------+
|        3 |
+----------+
mysql> SELECT COUNT(*) FROM t2;
ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES
1. Mặc dù các khóa thu được được giữ, phiên chỉ có thể truy cập các bảng bị khóa. Ví dụ: trong chuỗi câu lệnh sau, xảy ra lỗi đối với nỗ lực truy cập
FLUSH TABLES WITH READ LOCK;
START TRANSACTION;
SELECT ... ;
UNLOCK TABLES;
8 vì nó không bị khóa trong câu lệnh
mysql> LOCK TABLES t1 READ;
mysql> SELECT COUNT(*) FROM t1;
+----------+
| COUNT(*) |
+----------+
|        3 |
+----------+
mysql> SELECT COUNT(*) FROM t2;
ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES
1:

mysql> LOCK TABLES t1 READ;
mysql> SELECT COUNT(*) FROM t1;
+----------+
| COUNT(*) |
+----------+
|        3 |
+----------+
mysql> SELECT COUNT(*) FROM t2;
ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES

Các bảng trong cơ sở dữ liệu

SET autocommit=0;
LOCK TABLES t1 WRITE, t2 READ, ...;
... do something with tables t1 and t2 here ...
COMMIT;
UNLOCK TABLES;
0 là một ngoại lệ. Chúng có thể được truy cập mà không bị khóa rõ ràng ngay cả khi một phiên giữ các khóa bảng thu được với
mysql> LOCK TABLES t1 READ;
mysql> SELECT COUNT(*) FROM t1;
+----------+
| COUNT(*) |
+----------+
|        3 |
+----------+
mysql> SELECT COUNT(*) FROM t2;
ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES
1.

Bạn không thể tham khảo một bảng bị khóa nhiều lần trong một truy vấn bằng cùng tên. Thay vào đó, hãy sử dụng bí danh và có được một khóa riêng cho bảng và mỗi bí danh:

mysql> LOCK TABLE t WRITE, t AS t1 READ;
mysql> INSERT INTO t SELECT * FROM t;
ERROR 1100: Table 't' was not locked with LOCK TABLES
mysql> INSERT INTO t SELECT * FROM t AS t1;

Lỗi xảy ra đối với

mysql> LOCK TABLE t READ;
mysql> SELECT * FROM t AS myalias;
ERROR 1100: Table 'myalias' was not locked with LOCK TABLES
9 đầu tiên vì có hai tham chiếu đến cùng tên cho một bảng bị khóa.
mysql> LOCK TABLE t READ;
mysql> SELECT * FROM t AS myalias;
ERROR 1100: Table 'myalias' was not locked with LOCK TABLES
9 thứ hai thành công vì các tham chiếu đến bảng sử dụng các tên khác nhau.

Nếu các câu lệnh của bạn đề cập đến một bảng bằng bí danh, bạn phải khóa bảng bằng bí danh đó. Nó không hoạt động để khóa bảng mà không chỉ định bí danh:

mysql> LOCK TABLE t READ;
mysql> SELECT * FROM t AS myalias;
ERROR 1100: Table 'myalias' was not locked with LOCK TABLES

Ngược lại, nếu bạn khóa một bảng bằng bí danh, bạn phải tham khảo nó trong các câu lệnh của mình bằng bí danh đó:

mysql> LOCK TABLE t AS myalias READ;
mysql> SELECT * FROM t;
ERROR 1100: Table 't' was not locked with LOCK TABLES
mysql> SELECT * FROM t AS myalias;

Phát hành khóa bảng

Khi các khóa bảng được giữ bởi một phiên được phát hành, tất cả chúng đều được phát hành cùng một lúc. Một phiên có thể phát hành các khóa của nó một cách rõ ràng hoặc khóa có thể được phát hành ngầm trong một số điều kiện nhất định.

  • Một phiên có thể phát hành các khóa của nó một cách rõ ràng với

    SET autocommit=0;
    LOCK TABLES t1 WRITE, t2 READ, ...;
    ... do something with tables t1 and t2 here ...
    COMMIT;
    UNLOCK TABLES;
    4.

  • Nếu một phiên phát hành một câu lệnh

    SET autocommit=0;
    LOCK TABLES t1 WRITE, t2 READ, ...;
    ... do something with tables t1 and t2 here ...
    COMMIT;
    UNLOCK TABLES;
    5 để có được khóa trong khi đã giữ các khóa, các khóa hiện tại của nó sẽ được phát hành ngầm trước khi các khóa mới được cấp.

  • Nếu một phiên bắt đầu một giao dịch (ví dụ, với

    SET autocommit=0;
    LOCK TABLES t1 WRITE, t2 READ, ...;
    ... do something with tables t1 and t2 here ...
    COMMIT;
    UNLOCK TABLES;
    6), một
    SET autocommit=0;
    LOCK TABLES t1 WRITE, t2 READ, ...;
    ... do something with tables t1 and t2 here ...
    COMMIT;
    UNLOCK TABLES;
    4 ngầm được thực hiện, điều này khiến các khóa hiện có được phát hành. (Để biết thêm thông tin về sự tương tác giữa khóa bảng và giao dịch, xem tương tác của khóa bảng và giao dịch.)

Nếu kết nối cho phiên máy khách chấm dứt, dù là bình thường hay bất thường, máy chủ ngầm sẽ giải phóng tất cả các khóa bảng do phiên (giao dịch và không chuyển hóa). Nếu khách hàng kết nối lại, các khóa không còn có hiệu lực. Ngoài ra, nếu máy khách có một giao dịch hoạt động, máy chủ sẽ quay lại giao dịch khi ngắt kết nối và nếu kết nối lại xảy ra, phiên mới bắt đầu với AutoCommit được bật. Vì lý do này, khách hàng có thể muốn vô hiệu hóa tự động kết nối lại. Có hiệu lực, tự động kết nối, máy khách không được thông báo nếu kết nối lại xảy ra nhưng bất kỳ khóa bảng hoặc giao dịch hiện tại nào đều bị mất. Với tự động kết nối lại bị vô hiệu hóa, nếu kết nối giảm, xảy ra lỗi đối với câu lệnh tiếp theo được đưa ra. Khách hàng có thể phát hiện lỗi và thực hiện hành động thích hợp như làm lại khóa hoặc làm lại giao dịch. Xem điều khiển kết nối lại tự động.

Ghi chú

Nếu bạn sử dụng

SET autocommit=0;
LOCK TABLES t1 WRITE, t2 READ, ...;
... do something with tables t1 and t2 here ...
COMMIT;
UNLOCK TABLES;
8 trên bàn bị khóa, nó có thể trở nên mở khóa. Ví dụ: nếu bạn thử hoạt động
SET autocommit=0;
LOCK TABLES t1 WRITE, t2 READ, ...;
... do something with tables t1 and t2 here ...
COMMIT;
UNLOCK TABLES;
8 thứ hai, kết quả có thể là lỗi
LOCK TABLES t1 WRITE, t2 READ;
0 'không bị khóa với các bảng khóa. Để xử lý việc này, khóa bảng một lần nữa trước khi thay đổi thứ hai. Xem thêm Phần & NBSP; B.3.6.1, Các vấn đề với bảng thay đổi.

Tương tác của khóa bảng và giao dịch

mysql> LOCK TABLES t1 READ;
mysql> SELECT COUNT(*) FROM t1;
+----------+
| COUNT(*) |
+----------+
|        3 |
+----------+
mysql> SELECT COUNT(*) FROM t2;
ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES
1 và
LOCK TABLES t1 WRITE, t2 READ;
2 Tương tác với việc sử dụng các giao dịch như sau:

  • mysql> LOCK TABLES t1 READ;
    mysql> SELECT COUNT(*) FROM t1;
    +----------+
    | COUNT(*) |
    +----------+
    |        3 |
    +----------+
    mysql> SELECT COUNT(*) FROM t2;
    ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES
    1 không an toàn giao dịch và thực hiện bất kỳ giao dịch hoạt động nào trước khi cố gắng khóa các bảng.

  • SET autocommit=0;
    LOCK TABLES t1 WRITE, t2 READ, ...;
    ... do something with tables t1 and t2 here ...
    COMMIT;
    UNLOCK TABLES;
    4 ngầm thực hiện bất kỳ giao dịch hoạt động nào, nhưng chỉ khi
    mysql> LOCK TABLES t1 READ;
    mysql> SELECT COUNT(*) FROM t1;
    +----------+
    | COUNT(*) |
    +----------+
    |        3 |
    +----------+
    mysql> SELECT COUNT(*) FROM t2;
    ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES
    1 đã được sử dụng để có được khóa bảng. Ví dụ: trong tập hợp các câu lệnh sau đây,
    SET autocommit=0;
    LOCK TABLES t1 WRITE, t2 READ, ...;
    ... do something with tables t1 and t2 here ...
    COMMIT;
    UNLOCK TABLES;
    4 phát hành khóa đọc toàn cầu nhưng không thực hiện giao dịch vì không có khóa bảng nào có hiệu lực:

    FLUSH TABLES WITH READ LOCK;
    START TRANSACTION;
    SELECT ... ;
    UNLOCK TABLES;
  • Bắt đầu một giao dịch (ví dụ, với

    SET autocommit=0;
    LOCK TABLES t1 WRITE, t2 READ, ...;
    ... do something with tables t1 and t2 here ...
    COMMIT;
    UNLOCK TABLES;
    6) hoàn toàn thực hiện bất kỳ giao dịch hiện tại nào và phát hành khóa bảng hiện có.

  • mysql> LOCK TABLE t WRITE, t AS t1 READ;
    mysql> INSERT INTO t SELECT * FROM t;
    ERROR 1100: Table 't' was not locked with LOCK TABLES
    mysql> INSERT INTO t SELECT * FROM t AS t1;
    4 có được khóa đọc toàn cầu và không khóa bảng, do đó, nó không phải chịu hành vi tương tự như
    mysql> LOCK TABLES t1 READ;
    mysql> SELECT COUNT(*) FROM t1;
    +----------+
    | COUNT(*) |
    +----------+
    |        3 |
    +----------+
    mysql> SELECT COUNT(*) FROM t2;
    ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES
    1 và
    SET autocommit=0;
    LOCK TABLES t1 WRITE, t2 READ, ...;
    ... do something with tables t1 and t2 here ...
    COMMIT;
    UNLOCK TABLES;
    4 liên quan đến việc khóa bảng và cam kết ngầm. Ví dụ,
    SET autocommit=0;
    LOCK TABLES t1 WRITE, t2 READ, ...;
    ... do something with tables t1 and t2 here ...
    COMMIT;
    UNLOCK TABLES;
    6 không phát hành khóa đọc toàn cầu. Xem Phần & NBSP; 13.7.8.3, Tuyên bố tuôn ra.

  • Các tuyên bố khác mà ngầm thực hiện các giao dịch được cam kết không phát hành khóa bảng hiện có. Để biết danh sách các tuyên bố như vậy, hãy xem Phần & NBSP; 13.3.3, các câu lệnh gây ra một cam kết ngầm.

  • Cách chính xác để sử dụng

    SET autocommit=0;
    LOCK TABLES t1 WRITE, t2 READ, ...;
    ... do something with tables t1 and t2 here ...
    COMMIT;
    UNLOCK TABLES;
    5 và
    SET autocommit=0;
    LOCK TABLES t1 WRITE, t2 READ, ...;
    ... do something with tables t1 and t2 here ...
    COMMIT;
    UNLOCK TABLES;
    4 với các bảng giao dịch, chẳng hạn như bảng
    mysql> LOCK TABLE t AS myalias READ;
    mysql> SELECT * FROM t;
    ERROR 1100: Table 't' was not locked with LOCK TABLES
    mysql> SELECT * FROM t AS myalias;
    1, là bắt đầu một giao dịch với
    CREATE TRIGGER t1_a_ins AFTER INSERT ON t1 FOR EACH ROW
    BEGIN
      UPDATE t4 SET count = count+1
          WHERE id = NEW.id AND EXISTS (SELECT a FROM t3);
      INSERT INTO t2 VALUES(1, 2);
    END;
    5 (không phải
    SET autocommit=0;
    LOCK TABLES t1 WRITE, t2 READ, ...;
    ... do something with tables t1 and t2 here ...
    COMMIT;
    UNLOCK TABLES;
    6) theo sau là
    SET autocommit=0;
    LOCK TABLES t1 WRITE, t2 READ, ...;
    ... do something with tables t1 and t2 here ...
    COMMIT;
    UNLOCK TABLES;
    5 và không gọi
    SET autocommit=0;
    LOCK TABLES t1 WRITE, t2 READ, ...;
    ... do something with tables t1 and t2 here ...
    COMMIT;
    UNLOCK TABLES;
    4 cho đến khi bạn thực hiện giao dịch rõ ràng. Ví dụ: nếu bạn cần ghi vào Bảng
    CREATE TRIGGER t1_a_ins AFTER INSERT ON t1 FOR EACH ROW
    BEGIN
      UPDATE t4 SET count = count+1
          WHERE id = NEW.id AND EXISTS (SELECT a FROM t3);
      INSERT INTO t2 VALUES(1, 2);
    END;
    9 và đọc từ Bảng
    FLUSH TABLES WITH READ LOCK;
    START TRANSACTION;
    SELECT ... ;
    UNLOCK TABLES;
    8, bạn có thể làm điều này:

    SET autocommit=0;
    LOCK TABLES t1 WRITE, t2 READ, ...;
    ... do something with tables t1 and t2 here ...
    COMMIT;
    UNLOCK TABLES;

    Khi bạn gọi

    mysql> LOCK TABLES t1 READ;
    mysql> SELECT COUNT(*) FROM t1;
    +----------+
    | COUNT(*) |
    +----------+
    |        3 |
    +----------+
    mysql> SELECT COUNT(*) FROM t2;
    ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES
    1,
    mysql> LOCK TABLE t AS myalias READ;
    mysql> SELECT * FROM t;
    ERROR 1100: Table 't' was not locked with LOCK TABLES
    mysql> SELECT * FROM t AS myalias;
    1 trong nội bộ lấy khóa bàn của riêng mình và MySQL sẽ khóa bàn riêng.
    mysql> LOCK TABLE t AS myalias READ;
    mysql> SELECT * FROM t;
    ERROR 1100: Table 't' was not locked with LOCK TABLES
    mysql> SELECT * FROM t AS myalias;
    1 phát hành khóa bảng nội bộ của nó ở cam kết tiếp theo, nhưng để MySQL phát hành khóa bảng của nó, bạn phải gọi
    SET autocommit=0;
    LOCK TABLES t1 WRITE, t2 READ, ...;
    ... do something with tables t1 and t2 here ...
    COMMIT;
    UNLOCK TABLES;
    4. Bạn không nên có
    mysql.help_category
    mysql.help_keyword
    mysql.help_relation
    mysql.help_topic
    mysql.time_zone
    mysql.time_zone_leap_second
    mysql.time_zone_name
    mysql.time_zone_transition
    mysql.time_zone_transition_type
    5, vì sau đó
    mysql> LOCK TABLE t AS myalias READ;
    mysql> SELECT * FROM t;
    ERROR 1100: Table 't' was not locked with LOCK TABLES
    mysql> SELECT * FROM t AS myalias;
    1 phát hành khóa bảng nội bộ của nó ngay sau cuộc gọi của
    SET autocommit=0;
    LOCK TABLES t1 WRITE, t2 READ, ...;
    ... do something with tables t1 and t2 here ...
    COMMIT;
    UNLOCK TABLES;
    5 và bế tắc có thể rất dễ dàng xảy ra.
    mysql> LOCK TABLE t AS myalias READ;
    mysql> SELECT * FROM t;
    ERROR 1100: Table 't' was not locked with LOCK TABLES
    mysql> SELECT * FROM t AS myalias;
    1 hoàn toàn không có được khóa bảng nội bộ nếu
    mysql.help_category
    mysql.help_keyword
    mysql.help_relation
    mysql.help_topic
    mysql.time_zone
    mysql.time_zone_leap_second
    mysql.time_zone_name
    mysql.time_zone_transition
    mysql.time_zone_transition_type
    9, để giúp các ứng dụng cũ tránh các bế tắc không cần thiết.

  • mysql> LOCK TABLES t1 READ;
    mysql> SELECT COUNT(*) FROM t1;
    +----------+
    | COUNT(*) |
    +----------+
    |        3 |
    +----------+
    mysql> SELECT COUNT(*) FROM t2;
    ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES
    00 không phát hành khóa bảng.

Khóa bảng và kích hoạt

Nếu bạn khóa một bảng một cách rõ ràng với

mysql> LOCK TABLES t1 READ;
mysql> SELECT COUNT(*) FROM t1;
+----------+
| COUNT(*) |
+----------+
|        3 |
+----------+
mysql> SELECT COUNT(*) FROM t2;
ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES
01, bất kỳ bảng nào được sử dụng trong các kích hoạt cũng bị khóa ngầm:

  • Các khóa được thực hiện cùng thời gian với các khóa có được rõ ràng với câu lệnh

    SET autocommit=0;
    LOCK TABLES t1 WRITE, t2 READ, ...;
    ... do something with tables t1 and t2 here ...
    COMMIT;
    UNLOCK TABLES;
    5.

  • Khóa trên bảng được sử dụng trong trình kích hoạt phụ thuộc vào việc bảng chỉ được sử dụng để đọc. Nếu vậy, một khóa đọc đủ. Nếu không, một khóa ghi được sử dụng.

  • Nếu một bảng bị khóa rõ ràng để đọc với

    mysql> LOCK TABLES t1 READ;
    mysql> SELECT COUNT(*) FROM t1;
    +----------+
    | COUNT(*) |
    +----------+
    |        3 |
    +----------+
    mysql> SELECT COUNT(*) FROM t2;
    ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES
    1, nhưng cần phải khóa để viết vì nó có thể được sửa đổi trong một kích hoạt, khóa ghi được thực hiện thay vì khóa đọc. .

Giả sử rằng bạn khóa hai bảng,

CREATE TRIGGER t1_a_ins AFTER INSERT ON t1 FOR EACH ROW
BEGIN
  UPDATE t4 SET count = count+1
      WHERE id = NEW.id AND EXISTS (SELECT a FROM t3);
  INSERT INTO t2 VALUES(1, 2);
END;
9 và
FLUSH TABLES WITH READ LOCK;
START TRANSACTION;
SELECT ... ;
UNLOCK TABLES;
8, bằng cách sử dụng câu lệnh này:

LOCK TABLES t1 WRITE, t2 READ;

Nếu

CREATE TRIGGER t1_a_ins AFTER INSERT ON t1 FOR EACH ROW
BEGIN
  UPDATE t4 SET count = count+1
      WHERE id = NEW.id AND EXISTS (SELECT a FROM t3);
  INSERT INTO t2 VALUES(1, 2);
END;
9 hoặc
FLUSH TABLES WITH READ LOCK;
START TRANSACTION;
SELECT ... ;
UNLOCK TABLES;
8 có bất kỳ yếu tố kích hoạt nào, các bảng được sử dụng trong các kích hoạt cũng bị khóa. Giả sử rằng
CREATE TRIGGER t1_a_ins AFTER INSERT ON t1 FOR EACH ROW
BEGIN
  UPDATE t4 SET count = count+1
      WHERE id = NEW.id AND EXISTS (SELECT a FROM t3);
  INSERT INTO t2 VALUES(1, 2);
END;
9 có trình kích hoạt được xác định như thế này:

CREATE TRIGGER t1_a_ins AFTER INSERT ON t1 FOR EACH ROW
BEGIN
  UPDATE t4 SET count = count+1
      WHERE id = NEW.id AND EXISTS (SELECT a FROM t3);
  INSERT INTO t2 VALUES(1, 2);
END;

Kết quả của câu lệnh

mysql> LOCK TABLES t1 READ;
mysql> SELECT COUNT(*) FROM t1;
+----------+
| COUNT(*) |
+----------+
|        3 |
+----------+
mysql> SELECT COUNT(*) FROM t2;
ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES
1 là
CREATE TRIGGER t1_a_ins AFTER INSERT ON t1 FOR EACH ROW
BEGIN
  UPDATE t4 SET count = count+1
      WHERE id = NEW.id AND EXISTS (SELECT a FROM t3);
  INSERT INTO t2 VALUES(1, 2);
END;
9 và
FLUSH TABLES WITH READ LOCK;
START TRANSACTION;
SELECT ... ;
UNLOCK TABLES;
8 bị khóa vì chúng xuất hiện trong câu lệnh và
mysql> LOCK TABLES t1 READ;
mysql> SELECT COUNT(*) FROM t1;
+----------+
| COUNT(*) |
+----------+
|        3 |
+----------+
mysql> SELECT COUNT(*) FROM t2;
ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES
12 và
mysql> LOCK TABLES t1 READ;
mysql> SELECT COUNT(*) FROM t1;
+----------+
| COUNT(*) |
+----------+
|        3 |
+----------+
mysql> SELECT COUNT(*) FROM t2;
ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES
13 bị khóa vì chúng được sử dụng trong kích hoạt:

  • CREATE TRIGGER t1_a_ins AFTER INSERT ON t1 FOR EACH ROW
    BEGIN
      UPDATE t4 SET count = count+1
          WHERE id = NEW.id AND EXISTS (SELECT a FROM t3);
      INSERT INTO t2 VALUES(1, 2);
    END;
    9 bị khóa để viết theo yêu cầu khóa
    mysql> LOCK TABLE t WRITE, t AS t1 READ;
    mysql> INSERT INTO t SELECT * FROM t;
    ERROR 1100: Table 't' was not locked with LOCK TABLES
    mysql> INSERT INTO t SELECT * FROM t AS t1;
    5.

  • FLUSH TABLES WITH READ LOCK;
    START TRANSACTION;
    SELECT ... ;
    UNLOCK TABLES;
    8 bị khóa để viết, mặc dù yêu cầu là khóa
    mysql> LOCK TABLE t WRITE, t AS t1 READ;
    mysql> INSERT INTO t SELECT * FROM t;
    ERROR 1100: Table 't' was not locked with LOCK TABLES
    mysql> INSERT INTO t SELECT * FROM t AS t1;
    8. Điều này xảy ra do
    FLUSH TABLES WITH READ LOCK;
    START TRANSACTION;
    SELECT ... ;
    UNLOCK TABLES;
    8 được chèn vào trong kích hoạt, do đó yêu cầu
    mysql> LOCK TABLE t WRITE, t AS t1 READ;
    mysql> INSERT INTO t SELECT * FROM t;
    ERROR 1100: Table 't' was not locked with LOCK TABLES
    mysql> INSERT INTO t SELECT * FROM t AS t1;
    8 được chuyển đổi thành yêu cầu
    mysql> LOCK TABLE t WRITE, t AS t1 READ;
    mysql> INSERT INTO t SELECT * FROM t;
    ERROR 1100: Table 't' was not locked with LOCK TABLES
    mysql> INSERT INTO t SELECT * FROM t AS t1;
    5.

  • mysql> LOCK TABLES t1 READ;
    mysql> SELECT COUNT(*) FROM t1;
    +----------+
    | COUNT(*) |
    +----------+
    |        3 |
    +----------+
    mysql> SELECT COUNT(*) FROM t2;
    ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES
    12 bị khóa để đọc vì nó chỉ được đọc từ bên trong kích hoạt.

  • mysql> LOCK TABLES t1 READ;
    mysql> SELECT COUNT(*) FROM t1;
    +----------+
    | COUNT(*) |
    +----------+
    |        3 |
    +----------+
    mysql> SELECT COUNT(*) FROM t2;
    ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES
    13 bị khóa để viết vì nó có thể được cập nhật trong trình kích hoạt.

Các hạn chế và điều kiện khóa bàn

Bạn có thể sử dụng

mysql> LOCK TABLES t1 READ;
mysql> SELECT COUNT(*) FROM t1;
+----------+
| COUNT(*) |
+----------+
|        3 |
+----------+
mysql> SELECT COUNT(*) FROM t2;
ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES
23 một cách an toàn để chấm dứt một phiên đang chờ khóa bảng. Xem Phần & NBSP; 13.7.8.4, Tuyên bố giết người.

mysql> LOCK TABLES t1 READ;
mysql> SELECT COUNT(*) FROM t1;
+----------+
| COUNT(*) |
+----------+
|        3 |
+----------+
mysql> SELECT COUNT(*) FROM t2;
ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES
1 và
LOCK TABLES t1 WRITE, t2 READ;
2 không thể được sử dụng trong các chương trình được lưu trữ.

Các bảng trong cơ sở dữ liệu

mysql> LOCK TABLES t1 READ;
mysql> SELECT COUNT(*) FROM t1;
+----------+
| COUNT(*) |
+----------+
|        3 |
+----------+
mysql> SELECT COUNT(*) FROM t2;
ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES
26 không thể bị khóa với
mysql> LOCK TABLES t1 READ;
mysql> SELECT COUNT(*) FROM t1;
+----------+
| COUNT(*) |
+----------+
|        3 |
+----------+
mysql> SELECT COUNT(*) FROM t2;
ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES
01, ngoại trừ các bảng
mysql> LOCK TABLES t1 READ;
mysql> SELECT COUNT(*) FROM t1;
+----------+
| COUNT(*) |
+----------+
|        3 |
+----------+
mysql> SELECT COUNT(*) FROM t2;
ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES
28.

Phạm vi của khóa được tạo bởi

mysql> LOCK TABLES t1 READ;
mysql> SELECT COUNT(*) FROM t1;
+----------+
| COUNT(*) |
+----------+
|        3 |
+----------+
mysql> SELECT COUNT(*) FROM t2;
ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES
1 là một máy chủ MySQL duy nhất. Nó không tương thích với cụm NDB, không có cách nào để thực thi khóa cấp SQL trên nhiều trường hợp của MySQLD. Thay vào đó, bạn có thể thực thi khóa trong một ứng dụng API. Xem Phần & NBSP; 23.2.7.10, Giới hạn liên quan đến nhiều nút cụm NDB, để biết thêm thông tin.mysqld. You can enforce locking in an API application instead. See Section 23.2.7.10, “Limitations Relating to Multiple NDB Cluster Nodes”, for more information.

Các tuyên bố sau đây bị cấm trong khi tuyên bố

mysql> LOCK TABLES t1 READ;
mysql> SELECT COUNT(*) FROM t1;
+----------+
| COUNT(*) |
+----------+
|        3 |
+----------+
mysql> SELECT COUNT(*) FROM t2;
ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES
1 có hiệu lực:
mysql> LOCK TABLES t1 READ;
mysql> SELECT COUNT(*) FROM t1;
+----------+
| COUNT(*) |
+----------+
|        3 |
+----------+
mysql> SELECT COUNT(*) FROM t2;
ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES
31,
mysql> LOCK TABLES t1 READ;
mysql> SELECT COUNT(*) FROM t1;
+----------+
| COUNT(*) |
+----------+
|        3 |
+----------+
mysql> SELECT COUNT(*) FROM t2;
ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES
32,
mysql> LOCK TABLES t1 READ;
mysql> SELECT COUNT(*) FROM t1;
+----------+
| COUNT(*) |
+----------+
|        3 |
+----------+
mysql> SELECT COUNT(*) FROM t2;
ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES
33,
mysql> LOCK TABLES t1 READ;
mysql> SELECT COUNT(*) FROM t1;
+----------+
| COUNT(*) |
+----------+
|        3 |
+----------+
mysql> SELECT COUNT(*) FROM t2;
ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES
34, và DDL về các chức năng và quy trình và sự kiện được lưu trữ.

Đối với một số hoạt động, các bảng hệ thống trong cơ sở dữ liệu

mysql> LOCK TABLES t1 READ;
mysql> SELECT COUNT(*) FROM t1;
+----------+
| COUNT(*) |
+----------+
|        3 |
+----------+
mysql> SELECT COUNT(*) FROM t2;
ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES
35 phải được truy cập. Ví dụ: câu lệnh
mysql> LOCK TABLES t1 READ;
mysql> SELECT COUNT(*) FROM t1;
+----------+
| COUNT(*) |
+----------+
|        3 |
+----------+
mysql> SELECT COUNT(*) FROM t2;
ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES
36 yêu cầu nội dung của các bảng trợ giúp phía máy chủ và
mysql> LOCK TABLES t1 READ;
mysql> SELECT COUNT(*) FROM t1;
+----------+
| COUNT(*) |
+----------+
|        3 |
+----------+
mysql> SELECT COUNT(*) FROM t2;
ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES
37 có thể cần phải đọc các bảng múi giờ. Máy chủ ngầm khóa các bảng hệ thống để đọc khi cần thiết để bạn không cần phải khóa chúng một cách rõ ràng. Các bảng này được đối xử như vừa mô tả:

mysql.help_category
mysql.help_keyword
mysql.help_relation
mysql.help_topic
mysql.time_zone
mysql.time_zone_leap_second
mysql.time_zone_name
mysql.time_zone_transition
mysql.time_zone_transition_type

Nếu bạn muốn đặt khóa

mysql> LOCK TABLE t WRITE, t AS t1 READ;
mysql> INSERT INTO t SELECT * FROM t;
ERROR 1100: Table 't' was not locked with LOCK TABLES
mysql> INSERT INTO t SELECT * FROM t AS t1;
5 một cách rõ ràng trên bất kỳ bảng nào trong số đó có câu lệnh
mysql> LOCK TABLES t1 READ;
mysql> SELECT COUNT(*) FROM t1;
+----------+
| COUNT(*) |
+----------+
|        3 |
+----------+
mysql> SELECT COUNT(*) FROM t2;
ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES
01, bảng phải là thứ duy nhất bị khóa; Không có bảng nào khác có thể được khóa với cùng một tuyên bố.

Thông thường, bạn không cần phải khóa các bảng, vì tất cả các câu lệnh

mysql> LOCK TABLES t1 READ;
mysql> SELECT COUNT(*) FROM t1;
+----------+
| COUNT(*) |
+----------+
|        3 |
+----------+
mysql> SELECT COUNT(*) FROM t2;
ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES
40 là nguyên tử; Không có phiên nào khác có thể can thiệp vào bất kỳ câu lệnh SQL hiện đang thực hiện. Tuy nhiên, có một vài trường hợp khi khóa bảng có thể mang lại lợi thế:

  • Nếu bạn sẽ chạy nhiều hoạt động trên một bộ bảng

    mysql> LOCK TABLES t1 READ;
    mysql> SELECT COUNT(*) FROM t1;
    +----------+
    | COUNT(*) |
    +----------+
    |        3 |
    +----------+
    mysql> SELECT COUNT(*) FROM t2;
    ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES
    41, việc khóa các bảng bạn sẽ sử dụng nhanh hơn nhiều. Khóa bảng
    mysql> LOCK TABLES t1 READ;
    mysql> SELECT COUNT(*) FROM t1;
    +----------+
    | COUNT(*) |
    +----------+
    |        3 |
    +----------+
    mysql> SELECT COUNT(*) FROM t2;
    ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES
    41 tăng tốc độ chèn, cập nhật hoặc xóa chúng vì MySQL không xóa bộ đệm phím cho các bảng bị khóa cho đến khi
    SET autocommit=0;
    LOCK TABLES t1 WRITE, t2 READ, ...;
    ... do something with tables t1 and t2 here ...
    COMMIT;
    UNLOCK TABLES;
    4 được gọi. Thông thường, bộ đệm khóa được xóa sau mỗi câu lệnh SQL.

    Nhược điểm của việc khóa các bảng là không có phiên nào có thể cập nhật bảng được khóa ____ 28 (bao gồm cả bảng giữ khóa) và không có phiên nào có thể truy cập vào bảng được khóa ____ 25 khác với cái giữ khóa.

  • Nếu bạn đang sử dụng các bảng cho một công cụ lưu trữ không hoạt động, bạn phải sử dụng

    SET autocommit=0;
    LOCK TABLES t1 WRITE, t2 READ, ...;
    ... do something with tables t1 and t2 here ...
    COMMIT;
    UNLOCK TABLES;
    5 nếu bạn muốn đảm bảo rằng không có phiên nào khác sửa đổi các bảng giữa
    mysql> LOCK TABLES t1 READ;
    mysql> SELECT COUNT(*) FROM t1;
    +----------+
    | COUNT(*) |
    +----------+
    |        3 |
    +----------+
    mysql> SELECT COUNT(*) FROM t2;
    ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES
    3 và
    mysql> LOCK TABLES t1 READ;
    mysql> SELECT COUNT(*) FROM t1;
    +----------+
    | COUNT(*) |
    +----------+
    |        3 |
    +----------+
    mysql> SELECT COUNT(*) FROM t2;
    ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES
    40.Ví dụ được hiển thị ở đây yêu cầu
    mysql> LOCK TABLES t1 READ;
    mysql> SELECT COUNT(*) FROM t1;
    +----------+
    | COUNT(*) |
    +----------+
    |        3 |
    +----------+
    mysql> SELECT COUNT(*) FROM t2;
    ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES
    1 thực hiện an toàn:

    mysql> LOCK TABLES t1 READ;
    mysql> SELECT COUNT(*) FROM t1;
    +----------+
    | COUNT(*) |
    +----------+
    |        3 |
    +----------+
    mysql> SELECT COUNT(*) FROM t2;
    ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES
    0

    Không có

    mysql> LOCK TABLES t1 READ;
    mysql> SELECT COUNT(*) FROM t1;
    +----------+
    | COUNT(*) |
    +----------+
    |        3 |
    +----------+
    mysql> SELECT COUNT(*) FROM t2;
    ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES
    1, có thể một phiên khác có thể chèn một hàng mới trong bảng
    mysql> LOCK TABLES t1 READ;
    mysql> SELECT COUNT(*) FROM t1;
    +----------+
    | COUNT(*) |
    +----------+
    |        3 |
    +----------+
    mysql> SELECT COUNT(*) FROM t2;
    ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES
    51 giữa việc thực thi các câu lệnh
    mysql> LOCK TABLES t1 READ;
    mysql> SELECT COUNT(*) FROM t1;
    +----------+
    | COUNT(*) |
    +----------+
    |        3 |
    +----------+
    mysql> SELECT COUNT(*) FROM t2;
    ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES
    3 và
    mysql> LOCK TABLES t1 READ;
    mysql> SELECT COUNT(*) FROM t1;
    +----------+
    | COUNT(*) |
    +----------+
    |        3 |
    +----------+
    mysql> SELECT COUNT(*) FROM t2;
    ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES
    40.

Bạn có thể tránh sử dụng

mysql> LOCK TABLES t1 READ;
mysql> SELECT COUNT(*) FROM t1;
+----------+
| COUNT(*) |
+----------+
|        3 |
+----------+
mysql> SELECT COUNT(*) FROM t2;
ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES
1 trong nhiều trường hợp bằng cách sử dụng các bản cập nhật tương đối (____ 155 = ________ 156+________ 157) hoặc hàm
mysql> LOCK TABLES t1 READ;
mysql> SELECT COUNT(*) FROM t1;
+----------+
| COUNT(*) |
+----------+
|        3 |
+----------+
mysql> SELECT COUNT(*) FROM t2;
ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES
58.

Bạn cũng có thể tránh khóa các bảng trong một số trường hợp bằng cách sử dụng các chức năng khóa tư vấn cấp người dùng

mysql> LOCK TABLES t1 READ;
mysql> SELECT COUNT(*) FROM t1;
+----------+
| COUNT(*) |
+----------+
|        3 |
+----------+
mysql> SELECT COUNT(*) FROM t2;
ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES
59 và
mysql> LOCK TABLES t1 READ;
mysql> SELECT COUNT(*) FROM t1;
+----------+
| COUNT(*) |
+----------+
|        3 |
+----------+
mysql> SELECT COUNT(*) FROM t2;
ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES
60.Các khóa này được lưu trong bảng băm trong máy chủ và được triển khai với
mysql> LOCK TABLES t1 READ;
mysql> SELECT COUNT(*) FROM t1;
+----------+
| COUNT(*) |
+----------+
|        3 |
+----------+
mysql> SELECT COUNT(*) FROM t2;
ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES
61 và
mysql> LOCK TABLES t1 READ;
mysql> SELECT COUNT(*) FROM t1;
+----------+
| COUNT(*) |
+----------+
|        3 |
+----------+
mysql> SELECT COUNT(*) FROM t2;
ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES
62 cho tốc độ cao.Xem Phần & NBSP; 12.15, Chức năng khóa.

Xem Phần & NBSP; 8.11.1, Phương pháp khóa nội bộ, để biết thêm thông tin về chính sách khóa.