
[英]How to hide/lock linked PostgreSQL tables when MS Access is used as a front end and PostgreSQL as backend?
[英]How does postgresql lock tables when inserting and selecting?
我正在将数据从一个表迁移到另一个表,在这种环境中,任何长锁或停机时间都是不可接受的,总共大约 80000 行。 本质上,查询归结为这个简单的案例:
INSERT INTO table_2
SELECT * FROM table_1
JOIN table_3 on table_1.id = table_3.id
正在读取所有 3 个表,并且可以随时插入。 我只想运行上面的查询,但我不确定锁定是如何工作的,以及在操作过程中表是否完全无法访问。 我的理解告诉我,只有受影响的行(新插入的)会被锁定。 表 1 刚刚被选中,所以没有危害,并发插入是安全的,所以表 2 应该可以自由访问。
这种理解是否正确,我可以在生产环境中毫无顾虑地运行此查询吗? 如果它不安全,那么实现此目的的标准方法是什么?
你没事。
如果你对细节感兴趣,你可以阅读 多版本并发控制,或者Postgres MVCC 实现的细节,或者它的各种锁定模式如何交互,但是 文档中很好地总结了对你的情况的影响:
阅读从不阻碍写作,写作从不阻碍阅读
简而言之,存储在数据库中的每条记录都附有一些版本号,并且每个查询都知道要考虑哪些版本以及忽略哪些版本。
这意味着INSERT
可以安全地写入表而不锁定它,因为任何并发查询将简单地忽略新行,直到插入事务决定提交。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.