【发布时间】:2023-02-21 22:03:33
【问题描述】:
假设我有一个 DELETE/UPDATE 语句应该更新/删除 1 亿行。 那么 DELETE/UPDATE 语句会在事务开始时获取整个 1 亿行的锁,还是会在更新值时遇到行时获取锁?
事实证明,模拟这种情况对我来说非常困难。任何帮助将不胜感激。
【问题讨论】:
标签: postgresql database-deadlocks
假设我有一个 DELETE/UPDATE 语句应该更新/删除 1 亿行。 那么 DELETE/UPDATE 语句会在事务开始时获取整个 1 亿行的锁,还是会在更新值时遇到行时获取锁?
事实证明,模拟这种情况对我来说非常困难。任何帮助将不胜感激。
【问题讨论】:
标签: postgresql database-deadlocks
我不能确定它是否适用于所有 RDBMS,但对于 Postgres、MS SQL Server 和 Oracle 以下内容是正确的:
在开始更新任何内容之前,DBMS 会尝试获取每一行的锁,只有在它获得所需的每一行的锁之后,它才会开始更新/删除。
同样有趣的是,假设您需要更新 ID 为 1,2 和 3 的行。 假设 2 被锁定,您的更新仍将锁定第 1 行和第 3 行,并且它会等待第 2 行也锁定它,直到它持有第 1 行和第 3 行的锁,并且只有当它获得第 2 行的锁时以及更新所有 3 行 - 只有它释放锁。
希望这些信息能以某种方式帮助您。
【讨论】: