删除操作会阻止任何插入到同一个 table 中吗?
Does the delete operation block any insert into the same table?
我有 table A 和一个存储过程,可以定期从 table 中删除所有数据。存储过程中的所有查询都打包到 1 个事务中。但有时存储过程执行最多需要 5 分钟。难道执行存储过程会阻塞对同一个 table A?
的插入
在上一次调用完成之前,不会再次调用存储过程。
READ COMMITTED 和 READ COMMITTED SNAPSHOT ISOLATION 会有所不同吗?
是的,像 DELETE FROM YourTable;
这样的语句会取出一个 table 锁,阻止对 table 的所有其他更改,直到它完成。我认为更改隔离级别不会有太大帮助,除非您将快照放在整个数据库上(即快照隔离)。
通常您想针对这种情况尝试不同的方法。或者:
尝试将 DELETE 分成更小的“块”,这样每个块花费的时间更少,并且不会阻塞整个 table。或者如果这不合适,那么...
创建 YourTable
的空副本,然后将 YourTable
的名称更改为类似 Yourtable_deleting
的名称,并更改新的 table命名为 YourTable
。 然后 删除(或直接删除)Yourtable_deleting
。
我有 table A 和一个存储过程,可以定期从 table 中删除所有数据。存储过程中的所有查询都打包到 1 个事务中。但有时存储过程执行最多需要 5 分钟。难道执行存储过程会阻塞对同一个 table A?
的插入在上一次调用完成之前,不会再次调用存储过程。
READ COMMITTED 和 READ COMMITTED SNAPSHOT ISOLATION 会有所不同吗?
是的,像 DELETE FROM YourTable;
这样的语句会取出一个 table 锁,阻止对 table 的所有其他更改,直到它完成。我认为更改隔离级别不会有太大帮助,除非您将快照放在整个数据库上(即快照隔离)。
通常您想针对这种情况尝试不同的方法。或者:
尝试将 DELETE 分成更小的“块”,这样每个块花费的时间更少,并且不会阻塞整个 table。或者如果这不合适,那么...
创建
YourTable
的空副本,然后将YourTable
的名称更改为类似Yourtable_deleting
的名称,并更改新的 table命名为YourTable
。 然后 删除(或直接删除)Yourtable_deleting
。