我有一个长期运行的多行更新,例如:
UPDATE T set C1 = calculation(C2) where C1 is NULL
如果表很大,则此更新可能需要几秒钟甚至几分钟。在此期间,在连接超时到期后,此表上的所有其他查询都失败并显示“数据库已锁定”(目前我的超时时间为 5 秒)。
我想在 3 秒后停止这个更新查询,然后重新启动它。希望在几次重新启动后,整个表都会更新。另一种选择是在发出任何其他请求之前停止此更新查询(这将需要进程间合作,但它可能是可行的)。
但是我无法找到一种方法来停止更新查询而不回滚所有以前更新的记录。我尝试调用中断并从progress_handler 返回非0。这两种方法都会中止更新命令并回滚所有更改。因此,sqlite 似乎将此更新视为事务,在这种情况下这没有多大意义,因为所有行都是独立的。但是我不能为每一行开始一个新的事务,可以吗?
如果中断和progress_handler 不能帮助我,我还能做什么?
我还尝试使用 LIMIT 以及 WHERE custom_condition(C1) 进行更新。这些方法确实允许我提前终止更新,但它们比常规更新慢得多,并且它们不能在特定时间终止查询(在另一个连接超时到期之前)。
还有其他想法吗?这个多行更新是一种常见的操作,我希望其他人有一个很好的解决方案。