0

我刚刚了解了在 postgres-9.1 中使用可写公用表表达式,特别是从这个站点。http://vibhorkumar.wordpress.com/2011/10/26/upsertmerge-using-writable-cte-in-postgresql-9-1/

WITH upsert as
(update mytable2 m set sales=m.sales+d.sales, status=d.status from mytable d where m.pid=d.pid
  RETURNING m.*
)
insert into mytable2 select a.pid, a.sales,'NEW' from mytable a where a.pid not in (select b.pid from upsert b);

我向一些同事提到了这一点,并被问及 postgres 在执行此类操作时使用的并发模型/安全性。我的第一个想法是mytable在语句的整个执行过程中被锁定,因此在所有情况下都应该是线程安全的。

这是一个正确的假设吗?我对 postgres 语句执行的内部并发模型知之甚少。但是,如果有人想深入了解他们想要的尽可能多的细节,那就太好了=]

4

1 回答 1

1

PostgreSQL 通过 MVCC 处理并发操作,因此基本的 CRUD 操作永远不会锁定。

事务将只看到在它开始之前已经提交的数据。虽然它正在运行,但它不会收到关于它之外发生的任何更改的通知,即它只看到自己的更改。

如果您需要确保没有其他进程并行更改数据,则需要设置显式锁定。

文档中有很好的阅读:http ://www.postgresql.org/docs/current/static/mvcc-intro.html

于 2012-04-19T19:47:13.737 回答