multithreading - PostgreSQL:在恶劣的多用户环境中使用 SELECT nextval 生成器线程安全吗?

标签 multithreading postgresql

我的意思是成千上万的用户及时更新数据库中的值?

最佳答案

是的,nextval 可以安全地用于多个并发操作的事务。这就是它的目的和存在的理由。

也就是说,它实际上并不是“线程安全”的,因为 PostgreSQL 使用多处理模型而不是多线程模型,并且因为大多数客户端驱动程序(例如 libpq)不允许多于一个线程一次与单个连接进行交互。

您还应注意,虽然 nextval 保证返回不同且递增的值,但不能保证没有“漏洞”或“间隙”。当生成的值在未提交的情况下被丢弃(例如,通过 ROLLBACK)以及当 PostgreSQL 在服务器崩溃后恢复时,就会产生这种差距。

虽然 nextval 将始终返回递增的数字,但这并不意味着您的事务将按照它们从给定序列中获得 ID 的顺序提交。因此,发生这样的事情是完全正常的:

Start IDs in table: [1 2 3 4]
1st tx gets ID 5 from nextval()
2nd tx gets ID 6 from nextval()
2nd tx commits:     [1 2 3 4 6]
1st tx commits:     [1 2 3 4 5 6]

换句话说,洞可以出现也可以消失。

这两种异常都是使一个 nextval 调用不阻塞另一个调用的必要且不可避免的后果。

如果您想要一个没有此类排序和间隙异常的序列,则需要使用无间隙序列设计,该设计一次只允许一个事务具有未提交的生成 ID,从而有效地消除该表中插入的所有并发性。这通常是在计数器表上使用 SELECT FOR UPDATEUPDATE ... RETURNING 实现的。

搜索“PostgreSQL 无间隙序列”以获取更多信息。

关于multithreading - PostgreSQL:在恶劣的多用户环境中使用 SELECT nextval 生成器线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14215151/

相关文章:

multithreading - python3 : two clients sending data to server using sockets

c# - 从另一个线程写入 TextBox?

java - 同步 Java 线程时如何避免循环逻辑?

SQL 查询以获取主管层次结构的列表。员工 --> 主管 --> 主管

postgresql - 数据缺失时选择一行

c++ - 从 OCCI 环境获取连接时是否应该放置临界区

c++ - 从多个线程读取访问

postgresql - 同一张表上的两条 "SELECT FOR UPDATE"语句会导致死锁吗?

postgresql - PostgreSQL如何full join : counting number of events by day

node.js - 格式错误的数组文字 : "1" error when updating column in postgres sequelize migration script