Mysql 简明教程
MySQL - Table Locking
MySQL 数据库提供多用户环境,允许多个客户端同时访问该数据库。为了顺利运行此环境,MySQL 引入了锁的概念。
会话中的客户端可以锁定他们正在处理的某个表,以防止其他客户端使用同一张表。此过程将避免在多个用户同时处理同一张表时可能出现的任何数据丢失情况。
客户端可以根据需要锁定和解锁表。但是,如果某个客户端会话已锁定表,则在该表被释放之前,其他客户端会话无法访问该表。
Locking Tables in MySQL
您可以通过锁定表来限制访问 MYSQL 中表中的记录。这些锁用于阻止其他会话修改当前会话中的表。
MySQL 会话只能为自己获取或释放表中的锁。要使用 MySQL LOCK TABLES 语句锁定表,您需要具有 TABLE LOCK 和 SELECT 特权。
这些锁用于解决并发问题。MYSQL 表锁有两种 -
-
READ LOCK - 如果你对表应用此锁,则对其上的写操作受限制。即,只有持有锁的会话才能写入此表。
-
WRITE LOCK - 此锁允许限制会话(不拥有锁)对表执行读写操作。
Unlocking Tables in MySQL
一旦客户端会话完成对 MySQL 表的使用/访问后,他们必须解锁该表以便其他客户端会话使用它。为此,可以使用 MySQL UNLOCK TABLE 语句。这将释放表,直到其他会话再次将其锁定。
Example
让我们从创建一个名为 CUSTOMERS 的表开始,该表包含以下所示的详细信息 -
CREATE TABLE CUSTOMERS (
ID INT AUTO_INCREMENT,
NAME VARCHAR(20) NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR (25),
SALARY DECIMAL (18, 2),
PRIMARY KEY (ID)
);
现在,让我们使用 INSERT 语句向上面创建的表中插入 2 条记录,如下所示 -
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) VALUES
(1, 'Ramesh', 32, 'Ahmedabad', 2000.00 ),
(2, 'Khilan', 25, 'Delhi', 1500.00 );
使用以下查询创建另一个名为 BUYERS 的表 -
CREATE TABLE BUYERS (
B_ID INT AUTO_INCREMENT,
B_NAME VARCHAR(20) NOT NULL,
B_AGE INT NOT NULL,
B_ADDRESS CHAR (25),
B_SALARY DECIMAL (18, 2),
PRIMARY KEY (B_ID)
);
以下是使用 INSERT INTO SELECT 语句将记录插入 BUYERS 表的查询。在此,我们尝试从 CUSTOMERS 表向 BUYERS 表插入记录。
Locking and Unlocking:
在传输之前,我们要获取我们向其中插入记录的 BUYERS 表的写锁定,并获取我们从中插入记录的 CUSTOMERS 表的读锁定。最后,在传输后,我们要释放这些记录。
LOCK TABLES CUSTOMERS READ, BUYERS WRITE;
INSERT INTO BUYERS (B_ID, B_NAME, B_AGE, B_ADDRESS, B_SALARY)
SELECT
ID, NAME, AGE, ADDRESS, SALARY
FROM
CUSTOMERS
WHERE
ID = 1 AND NAME = 'Ramesh';
INSERT INTO BUYERS (B_ID, B_NAME, B_AGE, B_ADDRESS, B_SALARY)
SELECT
ID, NAME, AGE, ADDRESS, SALARY
FROM
CUSTOMERS
WHERE
ID = 2 AND NAME = 'Khilan';
UNLOCK TABLES;