PostgreSQL的序列(sequence)是一种特殊的数据库对象,主要用于生成唯一的自增数值,常被用作表的主键默认值。在高并发的业务场景中,多个事务同时请求序列的下一个值时,序列本身的设计就能保证生成的值不会重复,也不需要开发者额外加锁处理。

PostgreSQL序列的核心机制
序列的本质是一个存储在系统表pg_sequence中的计数器,每次调用nextval函数时,序列会原子性地递增计数器并返回新值。PostgreSQL对序列的操作做了特殊的并发处理,和普通的表行更新不同,序列的修改不会阻塞其他事务的序列请求。
序列的原子性操作实现
序列的nextval操作是数据库内核级别的原子操作,执行过程不需要获取行级锁,而是通过轻量级的闩锁(latch)来保证同一时间只有一个进程能修改序列的计数器值。这个操作的开销非常小,即使有上千个并发请求同时调用nextval,也不会出现性能瓶颈或者值重复的问题。
我们可以通过一个简单的示例来验证序列的并发安全性,首先创建一个测试序列:
-- 创建测试序列
CREATE SEQUENCE test_concurrent_seq START 1;
-- 查看序列当前值
SELECT currval('test_concurrent_seq');
序列的事务特性
需要注意的是,序列的操作是事务无关的,也就是说nextval一旦执行,即使后续的事务回滚,序列的值也不会回退。这是为了避免多个事务回滚后导致的序列值冲突,比如事务A获取了值10然后回滚,事务B在A执行期间获取了值11,如果A回滚后序列回退到9,下次获取就会得到10,和A之前获取的值重复。
我们可以通过以下代码验证这个特性:
-- 开启事务
BEGIN;
-- 获取序列下一个值,假设返回1
SELECT nextval('test_concurrent_seq');
-- 回滚事务
ROLLBACK;
-- 再次开启新事务获取下一个值,会返回2而不是1
BEGIN;
SELECT nextval('test_concurrent_seq');
ROLLBACK;
高并发下的序列使用注意事项
虽然序列本身能保证高并发安全,但在实际使用中还是有一些需要注意的点,避免因为使用不当导致问题。
避免频繁调用currval
currval函数的作用是获取当前会话中最近一次nextval调用返回的序列值,它只在当前会话有效,而且如果当前会话没有调用过nextval,调用currval会报错。高并发场景下不需要频繁使用currval,如果需要获取刚插入的主键值,更推荐使用RETURNING子句。
示例代码如下:
-- 创建测试表
CREATE TABLE test_table (
id INT DEFAULT nextval('test_concurrent_seq'),
name VARCHAR(50)
);
-- 插入数据并返回生成的id
INSERT INTO test_table (name) VALUES ('test_name') RETURNING id;
序列的缓存设置
创建序列时可以指定CACHE参数,默认值是1,意思是每次调用nextval时都会更新序列的持久化值。如果设置CACHE 100,那么序列会一次性预分配100个值到内存中,后续的nextval调用直接从内存取,减少系统表的更新次数,提升高并发场景下的性能。
不过CACHE参数有一个副作用,就是如果数据库异常重启,内存中预分配但没有被使用的值会丢失,导致序列出现空洞,但这不会影响唯一性,只是值不连续而已。
创建带缓存的序列示例:
-- 创建缓存为100的序列 CREATE SEQUENCE test_cache_seq START 1 CACHE 100;
不要手动修改序列值
高并发场景下不要手动执行ALTER SEQUENCE或者setval来修改序列的当前值,这类操作会获取更重的锁,可能阻塞其他正在请求序列的事务,甚至可能导致序列值回退引发重复问题。如果确实需要调整序列值,尽量在业务低峰期操作。
序列与SERIAL类型的区别
PostgreSQL中的SERIAL类型其实是序列的语法糖,创建SERIAL类型的列时,数据库会自动创建一个对应的序列,并且把列的默认值设置为nextval('序列名')。它的并发安全特性和直接使用序列完全一致,开发者不需要担心SERIAL类型在高并发下会出现值重复的问题。
创建SERIAL列的表示例:
-- 创建带有SERIAL主键的表
CREATE TABLE user_info (
user_id SERIAL PRIMARY KEY,
user_name VARCHAR(100)
);
总的来说,PostgreSQL的序列机制通过内核级的原子操作保证了高并发场景下的取值安全,开发者只需要正常使用nextval获取值即可,不需要额外做并发控制。了解序列的事务无关特性和缓存机制,能帮助我们更合理地使用序列,适配不同的业务场景需求。
PostgreSQLsequence高并发序列安全修改时间:2026-07-21 09:15:28