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
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].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 loại khóa sau có sẵn:
5 khóa:mysql> LOCK TABLE t READ; mysql> SELECT * FROM t AS myalias; ERROR 1100: Table 'myalias' was not locked with LOCK TABLES
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
8 cho bảng cùng một lú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;
-
Các phiên khác có thể đọc bảng mà không cần có khóa
8.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;
Trình sửa đổi
8 cho phép các câu lệnhmysql> 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ảngmysql> LOCK TABLE t READ; mysql> SELECT * FROM t AS myalias; ERROR 1100: Table 'myalias' 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;
2 giống như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;
8.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 khóa: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;
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
4.SET autocommit=0; LOCK TABLES t1 WRITE, t2 READ, ...; ... do something with tables t1 and t2 here ... COMMIT; UNLOCK TABLES;
Nếu một phiên phát hành một câu lệnh
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.SET autocommit=0; LOCK TABLES t1 WRITE, t2 READ, ...; ... do something with tables t1 and t2 here ... COMMIT; UNLOCK TABLES;
Nếu một phiên bắt đầu một giao dịch [ví dụ, với
6], mộtSET 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.]SET autocommit=0; LOCK TABLES t1 WRITE, t2 READ, ...; ... do something with tables t1 and t2 here ... COMMIT; UNLOCK TABLES;
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:
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.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
4 ngầm thực hiện bất kỳ giao dịch hoạt động nào, nhưng chỉ khiSET autocommit=0; LOCK TABLES t1 WRITE, t2 READ, ...; ... do something with tables t1 and t2 here ... COMMIT; UNLOCK 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,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
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:SET autocommit=0; LOCK TABLES t1 WRITE, t2 READ, ...; ... do something with tables t1 and t2 here ... COMMIT; UNLOCK TABLES;
FLUSH TABLES WITH READ LOCK; START TRANSACTION; SELECT ... ; UNLOCK TABLES;
Bắt đầu một giao dịch [ví dụ, với
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ó.SET autocommit=0; LOCK TABLES t1 WRITE, t2 READ, ...; ... do something with tables t1 and t2 here ... COMMIT; UNLOCK TABLES;
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 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 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
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.SET autocommit=0; LOCK TABLES t1 WRITE, t2 READ, ...; ... do something with tables t1 and t2 here ... COMMIT; UNLOCK TABLES;
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
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ảngSET autocommit=0; LOCK TABLES t1 WRITE, t2 READ, ...; ... do something with tables t1 and t2 here ... COMMIT; UNLOCK TABLES;
1, là bắt đầu một giao dịch vớimysql> 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;
5 [không phảiCREATE 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;
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ọiSET 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ảngSET autocommit=0; LOCK TABLES t1 WRITE, t2 READ, ...; ... do something with tables t1 and t2 here ... COMMIT; UNLOCK TABLES;
9 và đọc từ BảngCREATE 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;
8, bạn có thể làm điều này:FLUSH TABLES WITH READ LOCK; START TRANSACTION; SELECT ... ; UNLOCK TABLES;
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
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
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ọimysql> 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. Bạn không nên cóSET autocommit=0; LOCK TABLES t1 WRITE, t2 READ, ...; ... do something with tables t1 and t2 here ... COMMIT; UNLOCK TABLES;
5, vì sau đó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
1 phát hành khóa bảng nội bộ của nó ngay sau cuộc gọi củamysql> 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;
5 và bế tắc có thể rất dễ dàng xảy ra.SET autocommit=0; LOCK TABLES t1 WRITE, t2 READ, ...; ... do something with tables t1 and t2 here ... COMMIT; UNLOCK TABLES;
1 hoàn toàn không có được khóa bảng nội bộ nếumysql> 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;
9, để giúp các ứng dụng cũ tránh các bế tắc không cần thiế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
00 không phát hành 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
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
5.SET autocommit=0; LOCK TABLES t1 WRITE, t2 READ, ...; ... do something with tables t1 and t2 here ... COMMIT; UNLOCK TABLES;
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
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. .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
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:
9 bị khóa để viết theo yêu cầu khóaCREATE 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.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 bị khóa để viết, mặc dù yêu cầu là khóaFLUSH TABLES WITH READ LOCK; START TRANSACTION; SELECT ... ; UNLOCK TABLES;
8. Điều này xảy ra domysql> 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 chèn vào trong kích hoạt, do đó yêu cầuFLUSH TABLES WITH READ LOCK; START TRANSACTION; SELECT ... ; UNLOCK TABLES;
8 được chuyển đổi thành yêu cầumysql> 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 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;
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.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 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
41, việc khóa các bảng bạn sẽ sử dụng nhanh hơn nhiều. Khóa bảngmysql> 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 khimysql> 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
4 được gọi. Thông thường, bộ đệm khóa được xóa sau mỗi câu lệnh SQL.SET autocommit=0; LOCK TABLES t1 WRITE, t2 READ, ...; ... do something with tables t1 and t2 here ... COMMIT; UNLOCK TABLES;
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
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ữaSET autocommit=0; LOCK TABLES t1 WRITE, t2 READ, ...; ... do something with tables t1 and t2 here ... COMMIT; UNLOCK 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ầumysql> 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
0mysql> 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
Không có
1, có thể một phiên khác có thể chèn một hàng mới trong bảngmysql> 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ệnhmysql> 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.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
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.