数据库记录锁定

2024-02-02

我有一个服务器应用程序和一个数据库。服务器的多个实例可以同时运行,但所有数据都来自同一个数据库(在某些服务器上是 postgresql,在其他情况下是 ms sql server)。

在我的应用程序中,执行一个过程可能需要几个小时。我需要确保该进程一次只执行一个。如果一台服务器正在处理,则在第一个服务器实例完成之前,其他服务器实例都无法处理。

该流程依赖于一张表(我们称之为“ProcessTable”)。我所做的是,在任何服务器启动长达一小时的进程之前,我在 ProcessTable 中设置一个布尔标志,指示该记录已“锁定”并且正在处理(并非该表中的所有记录都被处理/锁定,所以我需要专门标记流程需要的每条记录)。因此,当下一个服务器实例出现而前一个实例仍在处理时,它会看到布尔标志并引发异常。

问题是,两个服务器实例可能几乎同时被激活,并且当两个服务器实例都检查 ProcessTable 时,可能没有设置任何标志,但两个服务器实际上都在“设置”标志的过程中,但由于事务尚未为任一进程提交,两个进程都不会看到另一个进程完成的锁定。这是因为锁定机制本身可能需要几秒钟的时间,因此存在 2 个服务器可能仍能够同时处理的机会窗口。

看来我需要的是“设置”表中的一条记录,它应该存储一个名为“LockInProgress”的布尔标志。因此,在服务器可以锁定 ProcessTable 中所需的记录之前,它首先必须通过检查“Settings”表中的“LockInProgress”列来确保它具有执行锁定的完全权限。

所以我的问题是,如何防止两台服务器同时修改设置表中的 LockInProgress 列...或者我是否以错误的方式处理此问题?

请注意,我需要同时支持 postgresql 和 ms sql 服务器,因为有些服务器使用一个数据库,有些服务器使用另一个数据库。

提前致谢...


首先获取记录上的锁,然后更新记录以显示“已锁定”如何?这样可以避免第二个实例成功获得锁而导致记录更新失败。

重点是确保锁定和更新作为一个原子步骤。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据库记录锁定 的相关文章

随机推荐