我有一个服务器应用程序和一个数据库。服务器的多个实例可以同时运行,但所有数据都来自同一个数据库(在某些服务器上是postgresql,在其他情况下是ms sql服务器)。数据库记录锁定
在我的应用程序中,有一个过程需要几个小时才能完成。我需要确保这个过程一次只能执行一次。如果一台服务器正在处理,则其他服务器实例不能处理,直到第一个服务器实例完成。
该过程依赖于一个表(我们称之为'ProcessTable')。我所做的是,在任何服务器启动长达一小时的过程之前,我在ProcessTable中设置一个布尔标志,表示此记录已被“锁定”并正在处理中(并未处理/锁定此表中的所有记录,所以我需要专门标记过程所需的每条记录)。因此,当下一个服务器实例出现而前一个实例仍在处理时,它会看到布尔标志并引发异常。
问题是,两个服务器实例可能几乎同时被激活,并且当两者都检查ProcessTable时,可能没有设置任何标志,但两个服务器实际上都在“设置”标志,但由于事务尚未提交任一进程,因此这两个进程都不会看到其他进程完成的锁定。这是因为锁定机制本身可能需要几秒钟的时间,所以有两个服务器仍然可以同时处理的机会窗口。
看来,我需要的是我的'设置'表中应该存储一个名为'LockInProgress'的布尔标志的单个记录。因此,在即使服务器可以锁定ProcessTable中所需的记录之前,首先必须通过检查Settings表中的'LockInProgress'列来确保它具有完全锁定权限。
所以我的问题是,如何防止两个服务器同时修改设置表中的LockInProgress列......或者我以错误的方式解决这个问题?
请注意,我需要支持postgresql和MS SQL服务器,因为有些服务器使用一个数据库,而有些服务器使用另一个。
在此先感谢...
这是一个更好的主意,然后从Pradeep的答案,如果是这样,为什么?看起来,这可能会起作用,但它似乎也有点复杂(可能更少一些“跨平台”)......我可能是错的...... – user85116 2010-02-25 19:01:31
您可能需要为每个支持的平台编写不同的sproc ,但编写某种插件机制以支持少数特定于平台的操作并不困难。这种方法的关键在于它使用本地锁定机制和语义(即一个进程被阻塞直到锁定变为空闲)。 – ConcernedOfTunbridgeWells 2010-02-26 07:29:16