LOCK TABLES
功能描述
如果需要保持数据库数据的一致性,可以使用LOCK TABLES
来阻止其他用户修改表。
例如,一个应用需要保证表中的数据在事务的运行过程中不被修改。为实现这个目的,则可以对表使用进行锁定以防止数据不被并发修改。
LOCK TABLES
使用后,会让接下来的SQL处于事务状态中,所以需要用UNLOCK TABLES
手动释放锁并结束事务。
另外如果需要对当前session只允许读的话,那么还可以用FLUSH TABLES WITH READ LOCK
实现,之后也需要用UNLOCK TABLES
手动结束这个功能。
注意事项
该功能仅在数据库兼容模式为MySQL时支持(即数据库实例初始化时指定DBCOMPATIBILITY='B')。
语法格式
加锁。
LOCK TABLES namelist READ/WRITE
让当前session处于只读表的状态。
FLUSH TABLES WITH READ LOCK
解锁。
UNLOCK TABLES
参数说明
namelist
要锁定的表的名称,可以有多个表。
READ/WRITE
锁的模式。取值范围如下:
- READ:读锁,只读取表而不修改的锁模式。
- WRITE:写锁,这个模式保证其所有者(事务)是可以访问该表的唯一事务。
示例
1、创建测试表格并插入数据。
CREATE TABLE graderecord
(
number INTEGER,
name CHAR(20),
class CHAR(20),
grade INTEGER
);
insert into graderecord values('210101','Alan','21.01',92);
2、给表格加锁。
LOCK TABLES graderecord WRITE;
3、删除表中数据。
DELETE FROM graderecord WHERE name ='Alan';
4、开启另一个会话,查询表中数据。
gsql -p 5432
此时会话被阻塞,不会返回查询结果。
SELECT * FROM graderecord;
5、解锁表,回显事务提交。
UNLOCK TABLES;
COMMIT
另一个会话中返回查询结果。
number | name | class | grade
--------+------+-------+-------
(0 rows)