PostgreSQL中的assign操作是原子的吗?

时间:2014-07-31 17:14:39

标签: sql postgresql postgresql-9.3

我想知道在PostgreSQL中,assign操作是否是原子的。我有一个带计数器的表,它将从多个线程递增,如下所示:

UPDATE SomeTable SET Counter = Counter + 1 WHERE Id = 10

多个postgresql-threads是否可能记住并更新导致数据丢失的相同值?

-- Counter = 111
THREAD #1: UPDATE SomeTable SET Counter = Counter + 1 WHERE Id = N
THREAD #2: UPDATE SomeTable SET Counter = Counter + 1 WHERE Id = N
-- Counter must be 113 even if two threads update it simultaneously

PostgreSQL是否保证增量操作的原子性?

3 个答案:

答案 0 :(得分:1)

对此没有简单的答案,这取决于您的交易隔离级别以及“安全”的级别。你需要(例如,如果TX在并发修改时失败了,可以吗?)。 你可以在这里阅读:http://www.postgresql.org/docs/9.3/static/transaction-iso.html。要在此处实现所需,您可能需要在具有可序列化隔离级别的事务中运行代码。

你对你实际想要达到的目标并不多说,但使用序列的方法可能是你问题的更好选择?:

http://www.postgresql.org/docs/9.3/static/sql-createsequence.html

答案 1 :(得分:0)

您提供的方式是安全的,因为值不是固定的。所有交易都是从仅对他们可见的快照计数值。 文档中有很多关于并发性的信息: http://www.postgresql.org/docs/current/static/mvcc-intro.html

答案 2 :(得分:0)

简短回答:是的。这是事务性RDBMS的意义(即,不是运行MyISAM或MEMORY的MySQL)。事务成功完成100%或完全失败100%并回滚。您可能还想阅读transactions,尽管此文档仅涉及此主题。本教程基本上使用您描述的确切场景作为示例。

您不会丢失数据,但可能会遇到锁定问题。请参阅concurrency上的文档。