没有锁的sql server中的master / worker

时间:2011-03-24 15:47:47

标签: java sql-server locking

使用ms sql-server实现master-worker方法的最佳方法是什么?即,一个java进程( master )将数据放入表中,一个或多个java进程( worker )从表中检索此数据,处理它并更新正在检索的记录中的一些字段。

为避免sql-server锁定,哪种方法更可行实现?

方法1: 单个将数据插入一个表中,一个工作人员检索它,处理和更新正在检索的记录中的状态标记。

方法2: 每个工作人员都有自己的表格,而单个主人会在表格中分配数据。每个 worker 从它自己的表中检索数据,处理它并更新状态标志。

就我而言,有一种 NO 方式来强制执行sql-server锁定记录的方法。它只能提供一些提示。如果是这样,第二种方法是否可以接受?

编辑:

@Matt Ball: Java进程可能只是一个线程。并且锁不是线程锁,而是sql-server记录/页/表锁。

我想避免使用sql-server锁或减少它们以提高性能。

感谢。

1 个答案:

答案 0 :(得分:3)

您无法避免数据库锁定,这就是大多数商业关系引擎保证ACID属性的方式。话虽如此,正如马丁指出的那样,你所希望的确是一个队列。队列是生产者 - 消费者或主人 - 工人模式的基石。由表支持的队列是可行的并且可以扩展得非常高:数百个concurent enqueue / dequeue操作是非常可行的。 Martin链接的文章详细解释了如何做到这一点。

每个工作人员或每个工作人员不需要单独的队列。每个工作人员分成一个表只会产生操作障碍:有多少个表?如果我添加一个工人怎么办?如果工人超载怎么办?如何将待处理的工作转移给另一个工作?如何在闲置期间关闭工人?单个队列是最好的方法,因为您可以动态地添加/减少工作人员数量,而无需执行昂贵的数据库操作(添加新表,传输现有工作等)。单个表格还允许多个工作人员自然地对工作进行负载平衡。

虽然技术上可行,但我建议不要做一个基于状态的表(状态'处理',状态'处理')。请使用真正的队列,当工作人员将其删除时,将删除记录。如果需要持久状态,请使用表作为状态和事件队列。排队的信息应包含要处理的ID。