Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/471.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 确保项目只能由1个用户使用的最佳方法_Javascript_C#_Sql_Api - Fatal编程技术网

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

Javascript 确保项目只能由1个用户使用的最佳方法,javascript,c#,sql,api,Javascript,C#,Sql,Api,我有一个web应用程序,它有两个主表(所有任务)和(正在进行中)。当您从(所有任务)中打开任务时,项目将被移动到(正在进行中)。现在,如果不同pc上的用户同时打开任务,它将复制 在你们看来,什么是确保复制不会发生的最好方法 我目前有一个列,如果未处理,则为0,如果已处理,则为1,但这仍然提供了2-3秒的时间段,可以同时从两台PC打开任务 我已经研究过guid和使用sql事务,尽管我读到这会让事情慢一点 我希望这有道理,伙计们 提前谢谢 初级devi这不是一个解决方案,只是一个快速启动的框架: C

我有一个web应用程序,它有两个主表(所有任务)和(正在进行中)。当您从(所有任务)中打开任务时,项目将被移动到(正在进行中)。现在,如果不同pc上的用户同时打开任务,它将复制

在你们看来,什么是确保复制不会发生的最好方法

我目前有一个列,如果未处理,则为0,如果已处理,则为1,但这仍然提供了2-3秒的时间段,可以同时从两台PC打开任务

我已经研究过guid和使用sql事务,尽管我读到这会让事情慢一点

我希望这有道理,伙计们

提前谢谢


初级devi

这不是一个解决方案,只是一个快速启动的框架:

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;
如果用户前来“预订”任务,则会出现以下结果之一:

  • 他们通过将HOLD标志设置为1(之前为零)获得“锁定”。因此,任务被预订并添加到进行中表(在我的示例中为工作队列)
  • 他们无法预订这项任务,因为它已经被其他人预订了。所以什么也没发生
如果您同时从多个用户运行“book out阶段”,那么只有一个用户将获得该任务,但是“减慢”的方式很少



另一种(更好的?)处理方法是存储正在运行作业的用户的用户id,而不是位标志。现在您知道谁拥有该作业,而不是简单地知道有人“预订”了该作业,因此您无法获得该作业?

为目标表指定一列,该列将包含源表中的主键,并对其设置唯一性约束。或者,如果可能的话,简单地给他们相同的主键


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

在数据库中保存新记录时,会发生重复。确保在不需要记录时不保存记录。应检查行是否已存在,并根据该行执行操作或放弃记录。使用事务时,如果正确使用它们,它们不应减慢速度。当第一个用户的事务完成时,第二个用户将等待2-3秒,这应该是唯一的减速。您还可以添加一个“进行中”标志,如果该标志为0,则在事务中将其设置为1,然后在处理完成时将其设置回0,在事务中也是如此。现在,第二个用户只会被延迟一秒钟,然后会看到“正在进行”标志已设置,无法获得任务?@RichardHansell因此,我目前使用的是“正在进行”标志,但它允许两个人打开同一个任务的2秒钟间隔。我将尝试这些交易,看看它如何影响绩效。谢谢男人:)对不起,伙计们,我说得不够清楚。一旦同一任务被两台pc同时打开,在该任务上输入的所有数据将在数据库中复制,而不一定是任务本身。所以我需要一个有效的标志。