PostgreSQL中的索引更新是原子的

时间:2018-04-19 06:19:55

标签: postgresql

设置

  • 包含整数列number
  • 的表
  • number不是主键
  • number可能为NULL
  • number上有唯一索引

方案

可能有多个并发工作者,每个人都执行此任务:

  1. 执行max(number)查询,本地保存
  2. 使用number更新表中的给定行,将最大值加1(先前为给定行为NULL)
  3. 捕获任何唯一性约束违规并重新排队给定行
  4. 预计会有数千个排队的行。

    基本上,这个想法是按需扩展严格的无间隙序列。表中将存在行number的行,直到它们被排序。一旦行具有非NULL number,它们就不会被删除。

    问题

    max(number)查询是索引查找。在尝试许多并发更新时,索引更新会发生什么?是吗:

    • 在索引更新时阻止max(number)个查询? (颠簸指数维护,并导致工人等待)
    • 表明索引不适合为查询提供服务,并回退到涉及扫描每一行的不同计划? (可能不会破坏索引维护,但仍导致工作人员等待较慢的查询)
    • 返回过时的最大结果,类似于非线程安全问题? (鞭打工人失败和重新排队)

0 个答案:

没有答案