我有一个存储在磁盘上的文件,可以跨网络场中的多个服务器访问。该文件会根据数据库中的数据变化进行必要的更新。我有一个数据库表,其中存储了一行,其中包含该文件的 URI 和一些基于一些数据库表的哈希值。如果哈希与其各自的表不匹配,则需要重新生成文件并插入新行。
如何使只有 1 个客户端重新生成此文件并插入一行?
最简单但最糟糕的解决方案(因为锁)是:
BEGIN TRANSACTION
SELECT ROW FROM TABLE (lock the table for the remainder of the transaction)
IF ROW IS OUT OF DATE:
REGENERATE FILE
INSERT ROW INTO TABLE
DO SOME STUFF WITH FILE (30s)
COMMIT TRANSACTION
但是,如果多个客户端执行此代码,则所有后续客户端都会在“DO SOME STUFF WITH FILE”处理期间等待很长时间。
有没有更好的方法来处理这个?也许改变我在提交之前处理文件的方式以使其更快?我已经为此困扰了几天。