确保项目只能由1个用户使用的最佳方法

时间:2018-07-03 09:11:50

标签: javascript c# sql api

我有一个带有两个主表(所有任务)和(进行中)的Web应用程序。当您从(所有任务)中打开任务时,该项目将移至(进行中)。现在,如果另一台PC上的用户同时打开任务,它将重复。

在你们看来,确保重复的最佳方法是什么。

我目前有一列,如果未处理,则为0,但如果处理,则为1,但这仍给出了2-3秒的时间段,可以同时从两台计算机中打开任务。

我已经研究了guid并使用sql事务,尽管我读过IVE会减慢速度

我希望这对我的兄弟们有意义

预先感谢

初中级

2 个答案:

答案 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;

如果用户来“预定”任务,则将出现以下结果之一:

  • 通过将保持标志设置为1(先前为零)来获得“锁定”。因此,该任务已被预订并添加到进度表(在我的示例中为工作队列);
  • 他们无法预定任务,因为它已经被其他人预定了。所以什么也没发生。

如果您要同时从多个用户运行“预订阶段”,那么只有一个用户可以完成任务,但是“减速”的方式很少。


另一种(更好的?)处理方法是存储正在运行作业的用户的user_id而不是BIT标志。现在,您知道谁拥有这份工作,而不是仅仅知道某人已经“将其订满了”,所以您找不到工作?

答案 1 :(得分:0)

为目标表提供一列,其中将包含源表中的主键,并在其上施加唯一性约束。或者,如果可能,只需给他们相同的主键即可。

例如,如果您的AllTasks表的主键为TaskID,则也要在TaskID表中放置一个InProgress列,并对其施加唯一性约束。如果两个用户尝试复制同一条记录,则第二条记录将违反约束,并且插入将失败。