我有一个表,其中包含在本地网络中不同计算机上运行的起始数据和多个消费者应用程序。
请建议我如何设置它们以便只从该数据库中获取一次记录,因此不会出现2个或更多应用程序从表中获取相同记录的任何情况。
我看到了两种可能的方法来解决它,但不确定:
请告知..
答案 0 :(得分:3)
要检索行,请创建一个存储过程:
要更新行,请创建一个存储过程:
附加的:
答案 1 :(得分:1)
各种选择:
NEWID
)来选择不太可能冲突的行然而,个人有其他存储隐喻在这里运作良好,例如“redis”有一些合适的操作:
所有这些都是原子的,避免了所有会使这成为SQL的痛苦。
答案 2 :(得分:0)
使用ProcessedBy向表中再添加一个字段,如果没有启动机器处理它,则可以将该值设置为null,如果它开始处理,则将值设置为machinename。在获取记录时,您可以验证此processedBy字段,如果它为null,则可以分配给任何计算机。
答案 3 :(得分:0)
您要求的是默认数据库行为。 您可以使用“SELECT ...... FOR UPDATE”,数据库引擎将锁定该行并使其对其他用户不可用。 但是,如果您的程序想要在很短的时间内(少于1秒)保存数据,那么这只是一个很好的做法,您的应用程序将持续数据的时间更长,会遇到很多死锁和争用问题。
您可以在应用程序代码中执行此操作,方法是使用“RESERVED_BY_USER”和“RESERVED_UNTIL”等列,应用程序可以自行管理。
然而,根据您所描述的内容,我认为您真正想要的是一个如here
所述的队列