我需要一个MsSql数据库表和另外8个(相同的)进程并行访问同一张表,进行select top n操作,处理这些n行,以及更新这些行中的某一列。问题在于我需要仅选取及处理每一行一次。这意味着如果一个进程已经连接到数据库并选择了前n行,当第二个进程来时,它应该发现这些行被锁定了,然后去选择从n到2*n行,以此类推……
是否有可能在选择行时对某些行加锁,并且当有人请求被锁定的前n行时返回下一行,而不是等待被锁定的行?看起来不太可能,但……
我还在想另一件事-也许不那么优雅,但听起来简单而安全,就是在数据库中为访问该表的实例设置一个计数器。第一个实例到来时会增加计数器并选择前n行,接下来的实例会递增计数器并选择从(n*(i-1))到(n*i)的行,以此类推……
听起来这个想法如何?你有更好的建议吗?非常感谢您的时间。
是否有可能在选择行时对某些行加锁,并且当有人请求被锁定的前n行时返回下一行,而不是等待被锁定的行?看起来不太可能,但……
我还在想另一件事-也许不那么优雅,但听起来简单而安全,就是在数据库中为访问该表的实例设置一个计数器。第一个实例到来时会增加计数器并选择前n行,接下来的实例会递增计数器并选择从(n*(i-1))到(n*i)的行,以此类推……
听起来这个想法如何?你有更好的建议吗?非常感谢您的时间。
processed
位列,并可能将DELETE
替换为UPDATE
。如果你决定使用计数器解决方案,这个答案 可能会有所帮助。 - Martin Smith