2013-08-02 41 views
0

我有一個我在php中編寫的呼叫中心web應用程序。我需要更好的方式來管理對客戶端數據庫的訪問。我可能有一個需要呼叫的1000個人的名單,並且我可能會有10個人同時查詢該數據庫,以便讓某人致電。最好的辦法是保持同一個記錄不會來自打電話的人之間。防止跨多個會話從MSSQL數據庫拉同一行

目前,我抓取一條記錄,,然後寫入一個字段,以表明它已被鎖定。所以當下一個人查詢數據庫時,它會檢查並確保它沒有拉動任何被標記爲鎖定的東西。這工作得很好,如果這是一個緩慢的夜晚。當你有很多人同時進行時,這不是一個足夠快的修復方法。

任何想法?

+0

能否請你分享更多一點有關詳細信息:_I在寫入字段時寫入記錄以表明它已鎖定._ –

+0

對不起,犯了一個語法錯誤。就是說我選擇了一條記錄,然後更新該記錄上的一個字段以表明它已被鎖定。 – Photovor

回答

0

當你查詢這個人時,你可以嘗試做一些相似的事情。

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

這會給你一個獨佔的行鎖,以防止其他人同時使用同一個人。

+0

您可以在[Table Hints(Transact-SQL)](http://msdn.microsoft.com/zh-cn/library/ms187373.aspx) –

+0

中瞭解關於rowlock和xlock等提示的更多信息。 ?你會保持這個事務處於打開狀態,直到調用者完成,並在相同事務中更新記錄(如果需要的話)? –

+0

我會保持這個記錄鎖定,直到交易完成。當事務完成後,我將信息寫入另一個表中,然後從第一個表中刪除該鎖定的記錄,因此它永遠不會再出現。使用上面的答案,我將如何解鎖該記錄以最終刪除它? – Photovor

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語句(或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'