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

时间:2012-03-22 22:33:06

标签: database postgresql transactions upsert atomicity

我想做这样的事情:

SELECT * FROM TABLE where *condition*
... TEST for a row being returned
IF NOT
    INSERT the row

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

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

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

1 个答案:

答案 0 :(得分:5)

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

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

  • 原子性
  • 一致性
  • 分离
  • 耐久性

你应该阅读链接的维基百科文章以及PostgreSQL手册中的Transaction Isolation章节,该手册还解释了PostgreSQL上下文中的所有内容。

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