0

私はphpで書いたコールセンターのWebアプリケーションを持っています。クライアント データベースへのアクセスをより適切に管理する方法が必要です。電話をかける必要がある 1000 人のリストがあり、10 人が同時にそのデータベースにクエリを実行して、電話をかける人を引き寄せる場合があります。通話している人々の間で同じ記録が発生しないようにする最善の方法は何ですか.

現在、レコードを取得し、そのレコードのフィールド書き込み、ロックされていることを示しています。そのため、次の人が DB にクエリを実行すると、ロックされているとマークされたものをプルしていないことが確認されます。遅い夜であれば、これは問題なく機能します。一度に多くの人が行っている場合、それを修正するのに十分な速さではありません.

何か案は?

4

2 に答える 2

0

おそらくあなたは次のようなことをしていると思います:

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ロジックによっては ) をoutput句とともに使用できます。

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'
于 2013-08-02T19:58:04.317 に答える
0

人を照会するときは、代わりにこれに似た何かを試すことができます。

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

これにより、他の人が同じ人を同時に使用するのを防ぐために、人に排他的な行ロックが与えられます。

于 2013-08-02T19:23:12.637 に答える