postgresql在插入和选择时如何锁定表?

时间:2018-03-06 10:35:14

标签: postgresql concurrency locking

我将数据从一个表迁移到另一个表中,在任何长锁或停机时间都不可接受的环境中,总共大约80000行。本质上,查询归结为这个简单的情况:

INSERT INTO table_2
SELECT * FROM table_1
JOIN table_3 on table_1.id = table_3.id

正在读取所有3个表,并且可以随时插入。我想只运行上面的查询,但我不确定锁定是如何工作的,以及在操作期间表是否完全无法访问。我的理解告诉我,只有受影响的行(新插入的)才会被锁定。表1正在被选中,因此没有危害,并发插入是安全的,因此表2应该是可以自由访问的。

这种理解是否正确,我可以毫不畏惧地在生产环境中运行此查询吗?如果它不安全,那么实现这个目标的标准方法是什么?

1 个答案:

答案 0 :(得分:1)

你没事。

如果您对详细信息感兴趣,可以阅读multiversion concurrency control,或Postgres MVCC implementation的详细信息或its various locking modes interact的详细信息,但对您的案例的影响是很好地总结在docs

  

阅读从不阻止写作和写作从不阻止阅读

简而言之,存储在数据库中的每条记录都附加了一些版本号,每个查询都知道要考虑哪些版本以及要忽略哪些版本。

这意味着INSERT可以安全地写入表而不锁定它,因为任何并发查询都会忽略新行,直到插入事务决定提交为止。