防止跨多个会话从MSSQL数据库中提取同一行



我有一个用php编写的呼叫中心web应用程序。我需要一种更好的方法来管理对客户端数据库的访问。我可能有一个需要打电话的1000人的列表,我可能有10个人同时查询该数据库,以便拉一个人打电话。我能保持相同记录的最好方法是什么,而不是在打电话的人之间出现。

目前,我获取一条记录,然后写入其中的字段以指示它已锁定。因此,当下一个人查询DB时,它会进行检查,以确保它没有提取任何标记为锁定的内容。如果这是一个缓慢的夜晚,这很好。当你有很多人同时去的时候,这不是一个足够快的解决方法。

有什么想法吗?

当您查询此人时,您可以尝试执行类似的操作。

     Select yourPerson from yourTable WITH (rowlock, xlock) WHERE yourPersonid = 1;

这将为您提供对该人员的排他行锁定,以防止其他人同时使用同一人员。

我想你可能正在做这样的事情:

declare @id int, @phone varchar(20), @name varchar(100)
select top (1) @id = id, @phone = phone, @name = name
from People
where status = 'awaiting'
update People
set status = 'in_process'
where id = @id --previously grabbed
--- etc.

这是不安全的,因为其他一些过程也可能在更新语句之前选择相同的记录

在这种情况下,您可以将update语句(或delete,取决于您的逻辑)与输出子句一起使用

declare @person table (id int, phone varchar(20), name varchar(100))
update top (1) p
set status = 'in_process'
output inserted.id, inserted.phone, inserted.name into @person
from People p
where status = 'awaiting'

最新更新