Javascript 确保项目只能由1个用户使用的最佳方法
我有一个web应用程序,它有两个主表(所有任务)和(正在进行中)。当您从(所有任务)中打开任务时,项目将被移动到(正在进行中)。现在,如果不同pc上的用户同时打开任务,它将复制 在你们看来,什么是确保复制不会发生的最好方法 我目前有一个列,如果未处理,则为0,如果已处理,则为1,但这仍然提供了2-3秒的时间段,可以同时从两台PC打开任务 我已经研究过guid和使用sql事务,尽管我读到这会让事情慢一点 我希望这有道理,伙计们 提前谢谢Javascript 确保项目只能由1个用户使用的最佳方法,javascript,c#,sql,api,Javascript,C#,Sql,Api,我有一个web应用程序,它有两个主表(所有任务)和(正在进行中)。当您从(所有任务)中打开任务时,项目将被移动到(正在进行中)。现在,如果不同pc上的用户同时打开任务,它将复制 在你们看来,什么是确保复制不会发生的最好方法 我目前有一个列,如果未处理,则为0,如果已处理,则为1,但这仍然提供了2-3秒的时间段,可以同时从两台PC打开任务 我已经研究过guid和使用sql事务,尽管我读到这会让事情慢一点 我希望这有道理,伙计们 提前谢谢 初级devi这不是一个解决方案,只是一个快速启动的框架: C
初级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(之前为零)获得“锁定”。因此,任务被预订并添加到进行中表(在我的示例中为工作队列)李>
- 他们无法预订这项任务,因为它已经被其他人预订了。所以什么也没发生
另一种(更好的?)处理方法是存储正在运行作业的用户的用户id,而不是位标志。现在您知道谁拥有该作业,而不是简单地知道有人“预订”了该作业,因此您无法获得该作业?为目标表指定一列,该列将包含源表中的主键,并对其设置唯一性约束。或者,如果可能的话,简单地给他们相同的主键
例如,如果
AllTasks
表的主键为TaskID
,则在InProgress
表中也放置TaskID
列,并对其设置唯一性约束。如果两个用户试图复制同一条记录,则第二条记录将违反约束,插入将失败。在数据库中保存新记录时,会发生重复。确保在不需要记录时不保存记录。应检查行是否已存在,并根据该行执行操作或放弃记录。使用事务时,如果正确使用它们,它们不应减慢速度。当第一个用户的事务完成时,第二个用户将等待2-3秒,这应该是唯一的减速。您还可以添加一个“进行中”标志,如果该标志为0,则在事务中将其设置为1,然后在处理完成时将其设置回0,在事务中也是如此。现在,第二个用户只会被延迟一秒钟,然后会看到“正在进行”标志已设置,无法获得任务?@RichardHansell因此,我目前使用的是“正在进行”标志,但它允许两个人打开同一个任务的2秒钟间隔。我将尝试这些交易,看看它如何影响绩效。谢谢男人:)对不起,伙计们,我说得不够清楚。一旦同一任务被两台pc同时打开,在该任务上输入的所有数据将在数据库中复制,而不一定是任务本身。所以我需要一个有效的标志。