1

从这个文档http://www.postgresql.org/docs/current/static/explicit-locking.html

我知道 PostgreSQL 提供了各种锁定模式来控制对表中数据的并发访问。

我的问题是我有很多会话将访问我的数据库,但我很困惑我应该制作 1 个 40 列的大表还是许多列更少的表(一对一关系)。

  1. 因为当我选择数据时,我会选择所有数据 ---> 当我使用 INNER JOIN 从许多表中选择时需要更多时间,但从 1 个大表中选择需要更少的时间。因此,如果我使用许多表,我的 php 响应会变慢。

  2. 但是当我只使用一张表同时许多会话会更新我的表中的数据时,我害怕死锁或延迟,因为命令 UPDATE、DELETE 和 INSERT 在目标表上获取 ROW EXCLUSIVE 锁定模式。一般来说,任何修改表中数据的命令都会获取这种锁定模式。

谁能建议我应该采取哪种最佳方法?一张大桌子还是多张桌子?

4

1 回答 1

8

确实INSERTUPDATEDELETE必须获取ROW EXCLUSIVE要更新的表的锁定。

但是,这个锁并不妨碍SELECT正常工作。SELECT只需要ACCESS SHARE锁。此锁兼容ROW EXCLUSIVE- 换句话说,您可以SELECT在其他数据由或更新时完美执行INSERT,只要您不获取任何显式锁。UPDATEDELETE

换句话说,你不应该看到使用第二种方法的任何死锁(只是不要使用SELECT FOR UPDATE,你会没事的)。

在PostgreSQL 文档中阅读更多内容。

于 2013-04-09T05:35:49.907 回答