數(shù)據(jù)庫高并發(fā)情況下重復(fù)值寫入的避免 字段組合約束
發(fā)布日期:2022-01-31 18:38 | 文章來源:gibhub
insert inti tablename(fields....) select @t1,@t2,@t3 from tablename where not exists (select id from tablename where t1=@t1,t2=@t2,t3=@t3)
當(dāng)時還是在高并發(fā)的情況下無效。此語句也包含在存儲過程中。(之前也嘗試線判斷有無記錄再看是否寫入,無效)。 因此,對于此類情況還是需要從數(shù)據(jù)庫的根本來解決,就是約束。否則數(shù)據(jù)庫的原子操作細不到我所需要的層面。
添加約束的命令行用得人不多,網(wǎng)上每次找SQL語句都累死,還是寫下來好了。
需要的關(guān)鍵就叫做 字段組合約束唯一性
alter table tablename add CONSTRAINT NewUniqueName Unique(t1,t2,t3)
這樣可以保證三個字段組合不重復(fù)
在生產(chǎn)系統(tǒng)數(shù)據(jù)庫的調(diào)整真是錙銖必較。。。。。。
對于數(shù)據(jù)庫讀操作的重復(fù)暫時沒有好的解決方法,就是讀數(shù)據(jù)庫某些條目同時將這些條目某個字段修改為1,然后其他進程讀的時候就不會重復(fù)讀取。但是在多線程情況下即使我使用了SQL SERVER 2005最新的特性,就是類似update...output into到臨時表的方法: update tablename set OnCheck=1,LastLockTime=getdate(),LastChecktime=getdate()
output deleted.ID into @newtb
where ID in
(select id from tablename where Oncheck=0)
還是會造成重復(fù)讀。難道沒有更好的辦法了嗎? 如果大家有更好的方法,可以發(fā)出來。
版權(quán)聲明:本站文章來源標注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。
相關(guān)文章
關(guān)注官方微信