当要更新大量行时,UPDATE/DELETE 事务获取行上的锁

问题描述 投票:0回答:1

假设我有一个 DELETE/UPDATE 语句应该更新/删除 1 亿行。 那么 DELETE/UPDATE 语句会在事务开始时获取整个 1 亿行的锁,还是会在更新值时遇到行时获取锁?

事实证明,模拟这种情况对我来说非常困难。真的很感激任何帮助。

postgresql database-deadlocks
1个回答
0
投票

我不能确定它是否适用于所有 RDBMS,但对于 Postgres、MS SQL Server 和 Oracle 以下是正确的:

在开始更新任何内容之前,DBMS 会尝试获取每一行的锁,只有在获得所需的每一行的锁之后,它才会开始更新/删除。

还有一个有趣的注意事项,假设您需要更新 ID 为 1,2 和 3 的行。 假设 2 被锁定,您的更新仍将锁定第 1 行和第 3 行,并且它会等待第 2 行也锁定它,直到它持有第 1 行和第 3 行的锁,并且只有当它获得第 2 行的锁时以及更新所有 3 行 - 只有它释放锁。

希望这些信息能以某种方式帮助您。

© www.soinside.com 2019 - 2024. All rights reserved.