Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
postgresql可写公共表表达式并发性_Sql_Postgresql_Common Table Expression_Postgresql 9.1_Database Concurrency - Fatal编程技术网

postgresql可写公共表表达式并发性

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操作永远不会锁定 事务将只看到启动前已提交的数据。当它运行

我刚刚学习了在postgres-9.1中使用可写公共表表达式,特别是在这个网站上

我向一些同事提到了这一点,有人问我postgres在执行类似操作时使用的并发模型/安全性。我的第一个想法是,
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);