锁主要是为了保持数据库数据的一致性,可以阻止用户修改一行或整个表,一般用在并发较高的数据库中。
在多个用户异步访问数据库时,如果不对其进行限制可能会出现读取数据和存储数据的不一致性。
数据库中有两种基本的锁:共享锁
(SHARE)、排它锁
(EXCLUSIVE)。
如果数据对象加上
排它锁
,则其他的事务不能
对它读取
和修改
。
如果加上
共享锁
,则该数据库对象可以
被其他事务读取
,但不能修改
。
锁的基本语法:LOCK [ TABLE ] name IN lock_mode
即以某种模式去锁定某张表,lock_mode有ACCESS SHARE,ROW SHARE, ROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE, SHARE,SHARE ROW EXCLUSIVE,EXCLUSIVE,ACCESS EXCLUSIVE等,具体格式可参考:Postgresql锁模式
获得锁之后,锁一般情况下都会继续保持,并且总是在事务结束时释放(包括事务提交和事务回滚)。
上述参考自菜鸟教程:PostgreSQL LOCK(锁)
上述介绍通常是用于表级锁,下面简单介绍一下行级锁。
与表级锁不同的是,行级锁不阻塞对于数据的查询,行级锁只是阻塞对同一行的写入。
要在不修改某行的前提下请求一个排斥行级锁
,用 SELECT FOR UPDATE
选取该行。一旦我们请求了特定的行级锁,就可以在事务中进行多次更新而不用担心冲突。
要在某一行请求一个共享行级锁
,用SELECT FOR SHARE
选取该行。一个共享锁并不阻止其他的事务请求同一个共享锁,不过,其他事务不允许更新、删除或者使用排斥锁锁住持有共享锁的行。任何其他企图都会被锁住等待共享锁的释放。