juk*_*juk 7 postgresql multithreading
我的意思是像数千名用户及时更新数据库中的值?
Cra*_*ger 16
是的,nextval从多个并发运营的交易中使用是安全的.这是它的目的和存在的原因.
也就是说,它本身并不是"线程安全的",因为PostgreSQL使用多处理模型而不是多线程模型,并且因为大多数客户端驱动程序(例如libpq)一次不允许多个线程与单个连接进行交互.
您还应该意识到,虽然nextval保证返回不同且增加的值,但不保证在没有"漏洞"或"间隙"的情况下这样做.当生成的值被丢弃而没有被提交(例如,由a 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]
Run Code Online (Sandbox Code Playgroud)
换句话说,孔可以出现和消失.
这两种异常都是必要的,并且使一次nextval呼叫不阻挡另一种呼叫的不可避免的后果.
如果您想要一个没有这种排序和间隙异常的序列,您需要使用无间隙序列设计,该设计一次只允许一个事务具有未提交的生成ID,从而有效地消除了该表中插入的所有并发性.这通常使用SELECT FOR UPDATE或UPDATE ... RETURNING在计数器表上实现.
搜索"PostgreSQL无间隙序列"以获取更多信息.
| 归档时间: |
|
| 查看次数: |
4268 次 |
| 最近记录: |