我想做这样的事情:
SELECT * FROM TABLE where *condition*
... TEST for a row being returned
IF NOT
INSERT the row
换句话说,我只想在表中插入一行(如果它还没有)。我担心的是,当我测试结果集时,该行实际上可能被另一个进程插入。我不知道这会插入两行。我不希望这种情况发生。
我想在交易中包装这两个陈述,但我怀疑这不是答案;我不知道事务是否具有类似于在执行时锁定表的效果,从而阻止了我的SELECT和INSERT之间的任何其他插入?这是个问题。
我怀疑最好的方法是在行中的列之间设置一个唯一键,以防止重复插入。但是我仍然想知道我关于使用交易的想法是否完全有效或完全没有?
答案 0 :(得分:5)
数据库将确保原子性。但这对你没有帮助,因为原子性并不意味着你的想法。它只是说,DB将完全或根本不执行一组操作。
这就是为什么DB人总是谈论ACID这意味着:
你应该阅读链接的维基百科文章以及PostgreSQL手册中的Transaction Isolation章节,该手册还解释了PostgreSQL上下文中的所有内容。
哦,在你的情况下你基本上需要ACI。如果您不想使用唯一索引,则必须在插入之前对整个表执行表锁定。 所以索引是最简单,最强大的解决方案。