Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.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
Php 防止跨多个会话从MSSQL数据库提取同一行_Php_Sql Server - Fatal编程技术网

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

Php 防止跨多个会话从MSSQL数据库提取同一行,php,sql-server,Php,Sql Server,我有一个用php编写的呼叫中心web应用程序。我需要一种更好的方法来管理对客户端数据库的访问。我可能有1000个需要呼叫的人的列表,我可能有10个人同时查询该数据库,以便吸引一个人呼叫。我可以用什么最好的方法来保持相同的记录,避免在打电话的人之间出现相同的记录 目前,我抓取一条记录,然后写入记录上的一个字段,表示它已锁定。因此,当下一个人查询数据库时,它会检查以确保它没有拉任何标记为锁定的内容。如果这是一个缓慢的夜晚,这个效果很好。当你有很多人同时去的时候,这不是一个足够快的解决方法 有什么想法

我有一个用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'