PostgreSQL - 做事务确保原子性吗?

2 database postgresql transactions upsert atomicity

我想做这样的事情:

SELECT * FROM TABLE where *condition*
... TEST for a row being returned
IF NOT
    INSERT the row
Run Code Online (Sandbox Code Playgroud)

换句话说,我只想在表中插入一行(如果它还没有).我担心的是,当我测试结果集时,该行实际上可能被另一个进程插入.我不知道这会插入两行.我不希望这种情况发生.

我想在交易中包装这两个陈述,但我怀疑这不是答案; 我不知道事务是否具有类似于在执行时锁定表的效果,从而阻止了我的SELECT和INSERT之间的任何其他插入?这是个问题.

我怀疑最好的方法是在行中的列之间设置一个唯一键,以防止重复插入.但是我仍然想知道我关于使用交易的想法是否完全有效或大量关闭?

A.H*_*.H. 5

数据库将确保原子性.但这对你没有帮助,因为原子性并不意味着你的想法.它只是说,DB将完全或根本不执行一组操作.

这就是为什么DB人总是谈论ACID的原因,这意味着:

  • 原子性
  • 一致性
  • 隔离
  • 耐久力

您应该阅读链接的维基百科文章以及PostgreSQL手册中的事务隔离一章,该手册还解释了PostgreSQL上下文中的所有内容.

哦,在你的情况下你基本上需要ACI.如果您不想使用唯一索引,则必须在插入之前对整个表执行表锁定.因此索引是最简单,最强大的解决方案.