mysql锁表
锁定表
LOCK TABLES tbl_name { READ | WRITE }, [ tbl_name { READ | WRITE }, ...]
LOCK TABLES table1 WRITE, table2 READ;
- READ锁代表其他用户只能读,不能进行其他操作
- WRITE锁代表其他用户不能进行任何操作(包括读)
解锁表
UNLOCK TABLES
查看哪些表被锁
show OPEN TABLES where In_use > 0;
全局加锁
FLUSH TABLES WITH READ LOCK;
oracle锁表
行级锁定(mysql同)
# 锁定整张表
SELECT * FROM tbl_name t FOR UPDATE
# 只锁定主键=值得特定行
SELECT * FROM tbl_name t WHERE id=1 FOR UPDATE
通过select for update语句锁定的表,其他用户只能进行读操作,锁定者通过commit或rollback命令自动解锁。
表级锁定
LOCK TABLE <tbl_name> IN <lock_mode> mode [nowait]
lock_mode是锁定模式,nowait关键字用于防止无限期的等待其他用户释放锁。
lock_mode五种模式如下(1-5级别越高限制越大):
- 行共享(row share, rs):允许其他用户访问和锁定该表,但禁止排它锁锁定整张表。
- 排它锁(row exclusive, rx):与行共享模式相同,同时禁止其他用户在此表上使用共享锁。使用select …for update语句会在表上自动应用行排它锁。
- 共享(share, s):共享锁锁定表后,仅允许其他用户查询表中的行,但不允许插入、更新和删除行。多个用户可以在同一张表中放置共享锁,即允许资源共享。例如:如果用户每天都需要在结账时更新日销售额表,则可以在更新该表时使用共享锁以确保数据的一致性。
- 共享排它锁(share row exclusive, srx):执行比共享锁更多的限制。放置其他事务在表上应用共享锁、共享排它锁和排它锁。
- 排它锁(exclusive, x):对表执行最大的限制。除了允许其他用户查询该表记录,排它锁防止其他事务对表做任何更改或在表上应用任何类型的锁。
解锁
# 管理员权限执行
alter system kill session 'sid, serial#';