我的情況是,當有用戶請求某表一條記錄,就把這條記錄鎖定,并更新某欄位標識,以示這條記錄已被使用,現在存盤程序實作方法如下
declare @t nvarchar(20)
declare @error int=0
begin tran
select top 1 @t=telNo from 表 with(rowlock) where isUser=0 and DATEDIFF(ss, inDt, getdate())<=60 order by id desc
update top(1) 表 set isUser=1 where telNo=@t
set @error+=@@ERROR
if(@error<>0)
rollback tran
else
commit tran
麻煩大家都看一下有什么不對或不妥的地方,謝謝
uj5u.com熱心網友回復:
單表,單條記錄用事務, 沒太大必要。從業務上講, 你這種鎖定其實也沒有用處, 當兩個人(假設為A和B)同時取到一條記錄, A前 B后修改時, A B 看到的是同樣的修改前的內容,但修改完成的結果,A 是一臉懵逼。
建議:
這種情況, 增加一個 時間戳 就可以了。
取記錄時, 記錄 id 和 timestamp 。
更新記錄時, update tableName set c=@c where id=@id and timestamp=@t
如果更新行數為0,說明有人已經改過了, 前端提示:請重繪頁面,再次審查內容后再修改。
簡單一點, 可以不用時間戳 , 增加一個欄位 updateTime , DateTime 型別即可。
更新時,順便把 updateTime = GETDATE(), 當前時間。
取記錄時,記下 id, updateTime,
更新記錄時,
if not exists(select 1 from tableName where id=@id and updateTime =@updateTime )
說明有人已經改過了, 前端提示同上面。
uj5u.com熱心網友回復:
1樓的方法適用一些uj5u.com熱心網友回復:
吉普賽的歌 感謝回復,其實我的目的很簡單,正如你所說的用戶A select 了某條記錄就表明這條記錄他占了(用戶B不可讓他再 select 到這條記錄了),所以緊跟著后面 update 正是我的意圖,但你舉的方法似乎對我的需求有所差別,還望再看看
uj5u.com熱心網友回復:
參照https://blog.csdn.net/roy_88/article/details/2682044
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/133143.html
標籤:疑難問題
