我有一个分布式应用程序;也就是说,我有一个在多台计算机上运行的同构进程与中央数据库通信并访问网络文件共享。
此过程从网络文件共享中获取集合文件(通过 CIFS),对这些文件运行转换算法并将输出复制回网络文件共享。
我需要锁定输入文件,以便其他服务器——运行相同的进程——不能处理相同的文件。为了争论,假设我的描述过于简单化并且锁是绝对必须的。
这是我提出的解决方案,以及一些想法。
1)使用机会锁(oplocks)。此解决方案仅使用文件系统来锁定文件。这里的问题是我们必须尝试获取锁才能确定锁是否存在。由于网络重定向器协商锁定,这似乎很昂贵。这样做的好处是,可以以这样一种方式创建 oplock,当出现错误时它们会自动删除。
2) 使用数据库应用锁(通过 sp_getapplock)。这似乎会快得多,但现在我们使用数据库来锁定文件系统。此外,数据库应用程序锁可以通过事务或会话来限定范围,这意味着如果我想保持——然后释放——应用程序锁,我必须保持连接。目前,我们正在使用连接池,这将不得不改变,这本身可能是一个更大的对话。这种方法的好处是,如果我们失去与服务器的连接,锁将被清除。当然,这意味着如果我们失去了与数据库的连接,而不是网络文件共享,那么当我们仍在处理输入文件时,锁就会消失。
3)创建一个数据库表和存储过程来表示我想锁定的项目。这个过程很简单。这当然是潜在的网络错误。如果由于某种原因,数据库变得不可访问,锁将保持有效。然后我们需要派生一些算法来在以后清理它。
什么是最好的解决方案,为什么?答案不限于上面提到的那些。