我刚学会了在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语句执行的内部并发模型一无所知。但如果有人想要了解他们想要的更多细节,那就太棒了=]
答案 0 :(得分:1)
PostgreSQL通过MVCC处理并发操作,因此基本的CRUD操作永远不会锁定。
事务只会看到在启动之前已提交的数据。虽然它正在运行,但它不会收到有关其外发生的任何变化的通知,即它只看到自己的变化。
如果您需要确保没有其他进程并行更改数据,则需要设置显式锁定。
良好的阅读在文档中:http://www.postgresql.org/docs/current/static/mvcc-intro.html