1. 共享锁和排他锁:
- 共享锁(Shared Lock): 多个事务可以同时持有共享锁,这些事务之间不会相互阻塞。共享锁适用于读取操作,多个事务可以同时读取同一资源。
SELECT * FROM my_table FOR SHARE;
- 排他锁(Exclusive Lock): 一次只能有一个事务持有排他锁,其他事务无法同时持有共享锁或排他锁。排他锁适用于写入操作,确保对资源的独占访问。
SELECT * FROM my_table FOR UPDATE;
2. 锁级别:
在 PostgreSQL 中,事务可以使用 SET TRANSACTION 语句来设置锁级别。常见的锁级别包括:
- READ COMMITTED(默认): 每个查询只能看到已经提交的事务所做的更改。
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
- REPEATABLE READ: 在事务开始时看到的数据将在事务结束时保持不变,其他事务对数据的更改在事务结束前不可见。
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
- SERIALIZABLE: 事务之间的相互影响最小,确保所有事务按照顺序执行。
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
3. 行级锁:
PostgreSQL 支持行级锁,允许事务仅锁定它们需要修改的行,而不是整个表。行级锁可以通过 FOR UPDATE 和 FOR SHARE 子句来实现。
-- 排他锁,用于写入
SELECT * FROM my_table WHERE key_column = 'some_key' FOR UPDATE;
-- 共享锁,用于读取
SELECT * FROM my_table WHERE key_column = 'some_key' FOR SHARE;
4. 锁定表:
在某些情况下,可能需要锁定整个表,以防止其他事务对表进行写入。可以使用 LOCK 语句实现。
LOCK TABLE my_table IN SHARE MODE;
上述是一些 PostgreSQL 中锁的基本概念和用法。锁的使用需要谨慎,过度使用锁可能导致性能问题,因此在设计数据库时需要权衡并发性和一致性的需求。
转载请注明出处:http://www.zyzy.cn/article/detail/14151/PostgreSQL