假设我有一个DELETE/UPDATE语句,它应该更新/删除1亿行,那么DELETE/UPDATE语句是在事务刚开始时就获得这1亿行的锁,还是在更新行值时遇到行时获得锁?模拟这个场景对我来说非常坚韧。任何帮助都将不胜感激。
nukf8bse1#
我不能肯定这是否适用于所有RDBMS,但对于Postgres、MS SQL Server和Oracle,以下是正确的:在开始更新任何内容之前,DBMS会尝试获取每一行的锁,只有在获得所需的每一行的锁之后,才开始更新/删除。还有一个有趣的注意事项,假设您需要更新ID为1、2和3的行。假设2被锁定,您的更新仍将锁定行1和3,并且它将等待行2也锁定它,直到它将持有行1和3上的锁,并且只有当它也获得行2上的锁并更新所有3行时,它才会释放锁。希望这些信息能对你有所帮助。
1条答案
按热度按时间nukf8bse1#
我不能肯定这是否适用于所有RDBMS,但对于Postgres、MS SQL Server和Oracle,以下是正确的:
在开始更新任何内容之前,DBMS会尝试获取每一行的锁,只有在获得所需的每一行的锁之后,才开始更新/删除。
还有一个有趣的注意事项,假设您需要更新ID为1、2和3的行。假设2被锁定,您的更新仍将锁定行1和3,并且它将等待行2也锁定它,直到它将持有行1和3上的锁,并且只有当它也获得行2上的锁并更新所有3行时,它才会释放锁。
希望这些信息能对你有所帮助。