gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 11:20:16 24 4
gpt4 key购买 nike

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

最佳答案

是的,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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com