首批通过分布式安全可靠测评,为关键业务系统打造
锁表
更新时间:2023-08-01 11:45:47
表锁是最基本的锁定策略,它锁定整张表,在任意时刻只允许一个会话对该表进行读写操作。
您可以通过 LOCK TABLES 语句锁定表。
背景信息
数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。加锁是实现数据库并发控制的一个非常重要的技术。为了确保资源的安全性(也就是数据完整性和一致性)才引申出锁机制。利用其锁机制来实现事务间的数据并发访问及数据一致性。
前提条件
要锁定的表必须在用户自己的 Schema 中,或者用户必须具有 LOCK ANY TABLE 系统权限。
示例
以 EXCLUSIVE 模式锁定 tbl1 表。
```sql
obclient> LOCK TABLE tbl1 IN EXCLUSIVE MODE NOWAIT;
Query OK, 0 row affected
```
OceanBase 数据库当前版本所支持的锁定模式如下:
- ROW SHARE:允许并发访问锁定的表,禁止其他用户锁定整个表而进行独占访问,即禁止其他用户对表上
EXCLUSIVE锁。 - ROW EXCLUSIVE :禁止其他用户在
SHARE及以上(即SHARE,ROW SHARE EXCLUSIVE和EXCLUSIVE)的模式锁定表。在进行更新、插入、删除或进行SELECT FOR UPDATE操作时,将自动获得ROW EXCLUSIVE锁。 - SHARE:允许并发查询,但禁止更新锁定的表。SHARE 锁既会阻止对表内行的更新(
UPDATE,DELETE和INSERT)以及SELECT FOR UPDATE操作,也会阻止对表进行更高级别的锁定,即禁止其他用户对表上SHARE ROW EXCLUSIVE和EXCLUSIVE锁。 - SHARE ROW EXCLUSIVE:允许其他用户查看表中的行,但禁止其更新行(
UPDATE,DELETE和INSERT)及使用SELECT FOR UPDATE查询表中的行,且禁止对表上非ROW SHARE模式的锁。 - EXCLUSIVE:只允许其他用户对锁定的表进行查询,禁止其他用户在表上执行任何类型的 DML 语句或对表上任何类型的锁。
各个模式下的锁冲突关系如下表所示:
| 请求锁模式 | 当前锁模式 | |||||
|---|---|---|---|---|---|---|
| ROW SHARE | ROW EXCLUSIVE | SHARE | SHARE ROW EXCLUSIVE | EXCLUSIVE | ||
| ROW SHARE | x | |||||
| ROW EXCLUSIVE | x | x | x | |||
| SHARE | x | x | x | |||
| SHARE ROW EXCLUSIVE | x | x | x | x | ||
| EXCLUSIVE | x | x | x | x | x | |
更多 LOCK TABLES 语句的介绍,请参见 LOCK TABLES。