也许不是最好的,但如果我处于你的情况,我会在分离的队列中进行分离的批处理。
示例:您有两个用于队列和详细信息的表:
List_Queue(
id int identity not null primary key,
user_id varchar(xx),
is_processable tinyint default 0,
is_processing tinyint default 0,
is_processed tinyint default 0,
)
List_Queue_Detail(
queue_id int,
// your rest of data,
inserted_timestamp datetime
)
List_Queue
每次用户提交时都会插入该表。然后在您的示例中,它可能在队列表中有这种记录:
11, user01, 0, 0
12, user01, 0, 0
您的事务将插入到队列详细信息表中。它可能是未排序的,例如:
11, 1, '01.001'
11, 2, '01.021'
12, 4, '01.032'
12, 5, '01.044'
11, 3, '01.055'
12, 6, '01.061'
请注意以秒和毫秒为单位的时间戳。你可以在这里有正常的日期时间。
现在您已完成插入队列详细信息表。假设您现在处于这种队列状态:
11, user01, 0, 0, 0
12, user01, 1, 0, 0
进程 12 早于 11 完成。这是正常情况。现在您的批处理(可能每分钟执行一次)将获得“is_processed = 0 的最小队列 id”,因此您将获得:
11, user01, 0, 0, 0
它不处理请求。如果它可以处理,那么您可以开始将队列详细信息插入到真实的事务表中。不要忘记将请求标记为何is_processing
时开始插入。