postgresql可写公共表表达式并发性
我刚刚学习了在postgres-9.1中使用可写公共表表达式,特别是在这个网站上 我向一些同事提到了这一点,有人问我postgres在执行类似操作时使用的并发模型/安全性。我的第一个想法是,postgresql可写公共表表达式并发性,sql,postgresql,common-table-expression,postgresql-9.1,database-concurrency,Sql,Postgresql,Common Table Expression,Postgresql 9.1,Database Concurrency,我刚刚学习了在postgres-9.1中使用可写公共表表达式,特别是在这个网站上 我向一些同事提到了这一点,有人问我postgres在执行类似操作时使用的并发模型/安全性。我的第一个想法是,mytable在语句的整个执行过程中被锁定,因此在所有情况下都应该是线程安全的 这是正确的假设吗?我对postgres语句执行的内部并发模型一无所知。但如果有人想了解更多细节,那就太好了=]PostgreSQL通过MVCC处理并发操作,因此基本CRUD操作永远不会锁定 事务将只看到启动前已提交的数据。当它运行
mytable
在语句的整个执行过程中被锁定,因此在所有情况下都应该是线程安全的
这是正确的假设吗?我对postgres语句执行的内部并发模型一无所知。但如果有人想了解更多细节,那就太好了=]PostgreSQL通过MVCC处理并发操作,因此基本CRUD操作永远不会锁定 事务将只看到启动前已提交的数据。当它运行时,它不会收到关于它之外发生的任何更改的通知,即它只看到自己的更改 如果您需要确保没有其他进程同时更改数据,则需要设置显式锁定
文档中有良好的可读性:在我看来,该语句要么执行所需的upsert,要么失败并出现重复键错误。出现错误时,请求的任何活动都不会持久化,因此重试重复密钥错误是安全的。
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);