Php 防止跨多个会话从MSSQL数据库提取同一行
我有一个用php编写的呼叫中心web应用程序。我需要一种更好的方法来管理对客户端数据库的访问。我可能有1000个需要呼叫的人的列表,我可能有10个人同时查询该数据库,以便吸引一个人呼叫。我可以用什么最好的方法来保持相同的记录,避免在打电话的人之间出现相同的记录 目前,我抓取一条记录,然后写入记录上的一个字段,表示它已锁定。因此,当下一个人查询数据库时,它会检查以确保它没有拉任何标记为锁定的内容。如果这是一个缓慢的夜晚,这个效果很好。当你有很多人同时去的时候,这不是一个足够快的解决方法Php 防止跨多个会话从MSSQL数据库提取同一行,php,sql-server,Php,Sql Server,我有一个用php编写的呼叫中心web应用程序。我需要一种更好的方法来管理对客户端数据库的访问。我可能有1000个需要呼叫的人的列表,我可能有10个人同时查询该数据库,以便吸引一个人呼叫。我可以用什么最好的方法来保持相同的记录,避免在打电话的人之间出现相同的记录 目前,我抓取一条记录,然后写入记录上的一个字段,表示它已锁定。因此,当下一个人查询数据库时,它会检查以确保它没有拉任何标记为锁定的内容。如果这是一个缓慢的夜晚,这个效果很好。当你有很多人同时去的时候,这不是一个足够快的解决方法 有什么想法
有什么想法吗?当你询问这个人时,你可以试着做一些类似这样的事情
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语句之前选择相同的记录
在这种情况下,您可以在子句中使用update
语句(或delete
,具体取决于您的逻辑)
您可以在PHP代码可能是什么样子的地方了解更多关于rowlock和xlock之类的提示?您是否会将事务保持打开状态,直到调用方完成,并在同一事务中更新记录(如果需要)?我会将该记录锁定,直到事务完成。当事务完成时,我将信息写入另一个表中,然后从第一个表中删除该锁定记录,这样它就再也不会出现了。使用上面的答案,我如何解锁该记录以最终删除它?您还应该添加
readpass
table提示以跳过锁定的行。所以使用(rowlock、xlock、readpass)
。这意味着。。。排队。相反,您应该使用ServiceBroker(,)。请您分享更多关于以下内容的详细信息:我抓取一条记录,当写入记录上的某个字段以指示它已锁定时。对不起,犯了语法错误。这意味着我选择了一条记录,然后更新该记录上的一个字段以指示它已锁定。
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'