PostgreSQL中的锁
PostgreSQL中主要有两种锁,一个表锁,一个行锁。
PostgreSQL中也提供了页锁,咨询锁,但不需要关注,只是为了锁的完整性。
表锁
表锁显而易见,就是锁住整张表。
表锁也分为很多种模式,其中最核心的两个:
- ACCESS SHARE:共享锁(读锁),读读操作不阻塞,但是不允许出现写操作并行;
- ACCESS EXCLUSIVE:互斥锁(写锁),无论什么操作进来,都阻塞。
具体的可以查看官网文档:http://postgres.cn/docs/12/explicit-locking.html
表锁的实现:
就是基于LOCK开启表锁,指定表的名字name,其次在MODE中指定锁的模式,NOWAIT可以指定是否在没有拿到锁时,一直等待。
1 | -- 1号连接 |
当1号连接基于事务开启后,锁住当前表之后,如果使用默认的ACCESS EXCLUSIVE,其他连接操作表时,会直接阻塞住。
如果1号是基于ACCESS SHARE共享锁时,其他线程查询当前表是不会锁住的。
行锁
PostgreSQL的行锁和MySQL的基本是一模一样的,基于select for update就可以指定行锁。
MySQL中有一个概念,for update时,如果select的查询没有命中索引,可能会锁表。
PostgerSQL有个特点,一般情况,在select的查询没有命中索引时,他不一定会锁表,依然会实现行锁。
PostgreSQL的行锁,就两个,一个for update,一个for share。
在开启事务之后,直接执行select * from table where 条件 for update;
1 | -- 先开启事务 |
其他的连接要操作当前行,会阻塞住。