我刚刚了解了在 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 语句执行的内部并发模型知之甚少。但是,如果有人想深入了解他们想要的尽可能多的细节,那就太好了=]