SELECT / 删除并发场景 - Postgres
SELECT / DELETE concurrent scenario - Postgres
我知道 SELECT
在 Postgres 中不需要行锁。因此,我可以从连接 1 中的某些 table T
发出 SELECT
,然后其他人可以发出 DELETE
(在同一 table [ 中的所有行中) =13=]) 在连接 2 中,并且 DELETE
不会导致任何阻塞。对吗?
此处描述:
好的...我的问题是:此行为是否取决于在两个连接中的任何一个中使用的 ISOLATION LEVEL
?
我为什么要问这些?
在现实世界中,我们有类似的并发场景(如上),但 SELECT
与 TRUNCATE TABLE
不同。并且我们有一个阻塞问题,因为 TRUNCATE TABLE
(不像 DELETE * FROM TABLE
)需要独占 table 锁(当 SELECT
是 运行 时它无法获得)。所以我们正在考虑使用 DELETE *
而不是 TRUNCATE
(尽管 DELETE
稍微慢一些)来解决这个阻塞问题。
- 这种方法行得通吗?
- 行为是否取决于隔离级别?
无论您使用何种隔离级别(REPEATABLE READ
或更高级别,您的解决方案都将起作用(当然,您可能会遇到序列化错误,但这无关紧要)。
但是,TRUNCATE
会更有效率。如果您在使用锁时遇到问题,则表明您有使用 table 的长期 运行 事务。尽量避免这种情况,因为长事务通常是有问题的。
我知道 SELECT
在 Postgres 中不需要行锁。因此,我可以从连接 1 中的某些 table T
发出 SELECT
,然后其他人可以发出 DELETE
(在同一 table [ 中的所有行中) =13=]) 在连接 2 中,并且 DELETE
不会导致任何阻塞。对吗?
此处描述:
好的...我的问题是:此行为是否取决于在两个连接中的任何一个中使用的 ISOLATION LEVEL
?
我为什么要问这些?
在现实世界中,我们有类似的并发场景(如上),但 SELECT
与 TRUNCATE TABLE
不同。并且我们有一个阻塞问题,因为 TRUNCATE TABLE
(不像 DELETE * FROM TABLE
)需要独占 table 锁(当 SELECT
是 运行 时它无法获得)。所以我们正在考虑使用 DELETE *
而不是 TRUNCATE
(尽管 DELETE
稍微慢一些)来解决这个阻塞问题。
- 这种方法行得通吗?
- 行为是否取决于隔离级别?
无论您使用何种隔离级别(REPEATABLE READ
或更高级别,您的解决方案都将起作用(当然,您可能会遇到序列化错误,但这无关紧要)。
但是,TRUNCATE
会更有效率。如果您在使用锁时遇到问题,则表明您有使用 table 的长期 运行 事务。尽量避免这种情况,因为长事务通常是有问题的。