我有一个带有两个主表(所有任务)和(进行中)的Web应用程序。当您从(所有任务)中打开任务时,该项目将移至(进行中)。现在,如果另一台PC上的用户同时打开任务,它将重复。
在你们看来,确保重复的最佳方法是什么。
我目前有一列,如果未处理,则为0,但如果处理,则为1,但这仍给出了2-3秒的时间段,可以同时从两台计算机中打开任务。
我已经研究了guid并使用sql事务,尽管我读过IVE会减慢速度
我希望这对我的兄弟们有意义
预先感谢
初中级
答案 0 :(得分:0)
这并不是解决方案,只是一个快速入门的框架:
CREATE TABLE #tasks (task_id INT, other_stuff VARCHAR(50), held BIT);
INSERT INTO #tasks SELECT 1, 'My Test Task', 0;
CREATE TABLE #work_queue (task_id INT);
--User #1 puts a task onto the work queue
BEGIN TRANSACTION;
UPDATE #tasks SET held = 1 WHERE task_id = 1 AND held = 0;
--Did we get it?
IF @@ROWCOUNT = 1
INSERT INTO #work_queue SELECT 1;
COMMIT TRANSACTION;
--User #2 fails to get a handle to the task so nothing is put onto the work queue
--Note that this can be run asynch from a second session
BEGIN TRANSACTION;
UPDATE #tasks SET held = 1 WHERE task_id = 1 AND held = 0;
--Did we get it?
IF @@ROWCOUNT = 1
INSERT INTO #work_queue SELECT 1;
COMMIT TRANSACTION;
--Task completes
BEGIN TRANSACTION;
DELETE FROM #work_queue WHERE task_id = 1;
UPDATE #tasks SET held = 0 WHERE task_id = 1;
COMMIT TRANSACTION;
如果用户来“预定”任务,则将出现以下结果之一:
如果您要同时从多个用户运行“预订阶段”,那么只有一个用户可以完成任务,但是“减速”的方式很少。
另一种(更好的?)处理方法是存储正在运行作业的用户的user_id而不是BIT标志。现在,您知道谁拥有这份工作,而不是仅仅知道某人已经“将其订满了”,所以您找不到工作?
答案 1 :(得分:0)
为目标表提供一列,其中将包含源表中的主键,并在其上施加唯一性约束。或者,如果可能,只需给他们相同的主键即可。
例如,如果您的AllTasks
表的主键为TaskID
,则也要在TaskID
表中放置一个InProgress
列,并对其施加唯一性约束。如果两个用户尝试复制同一条记录,则第二条记录将违反约束,并且插入将失败。