I know SELECT
doesn't require row lock in Postgres. So I can issue a SELECT
from some table T
in connection 1, then someone else can issue a DELETE
(of all rows in the same table T
) in connection 2, and that DELETE
won't cause any blockings. Right?
This is described here:
Does SELECT prevent returned rows from getting deleted?
OK... My question is: does this behavior depend on the ISOLATION LEVEL
that's in use in either of the two connections?
Why am I asking all this?
In the real world, we have a similar concurrent scenario (as above) but with SELECT
vs. TRUNCATE TABLE
instead. And there we have a blocking problem because TRUNCATE TABLE
(unlike DELETE * FROM TABLE
) requires exclusive table lock (which it cannot obtain while a SELECT
is running). So we're thinking to use DELETE *
instead of TRUNCATE
(even though DELETE
is somewhat slower) to resolve this blocking issue.
- Will this approach work?
- And will the behavior depend on the ISOLATION LEVEL?