有排他鎖,但是排他鎖生存時間非常的短,

10年的嶧城網(wǎng)站建設(shè)經(jīng)驗,針對設(shè)計、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。網(wǎng)絡(luò)營銷推廣的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整嶧城建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計,從而大程度地提升瀏覽體驗。成都創(chuàng)新互聯(lián)從事“嶧城網(wǎng)站設(shè)計”,“嶧城網(wǎng)站推廣”以來,每個客戶項目都認真落實執(zhí)行。
1. 當開始更新時首先在表上放一個架構(gòu)鎖,防止其他事務(wù)修改架構(gòu);
2. 在非序列化隔離級別下,整個表上會放一個意向共享鎖,允許其他事務(wù)進行讀取;
3. 然后事務(wù)開始更新這個表,更新是會逐行更新的,你可以把更新理解為一個游標;
4. 每一行上首先放上一個更新鎖,成功放置更新鎖以后,更新鎖會變?yōu)榕潘i;
5. 然后更新這一行數(shù)據(jù),更新完畢后就會釋放這一行的排它鎖;
6. 整個表遍歷完畢后釋放架構(gòu)鎖,釋放意向共享鎖。
可以使用事務(wù),但是只有當兩張表都被更新了才會執(zhí)行成功,否則事務(wù)回滾.
例如:
begin tran --開始執(zhí)行事務(wù)
update bb set moneys=moneys-@momeys where ID=@fromID -執(zhí)行的第一個操作,轉(zhuǎn)賬出錢,減去轉(zhuǎn)出的金額
update bb set moneys=moneys+@momeys where ID=@toID --執(zhí)行第二個操作,接受轉(zhuǎn)賬的金額,增加
if @@error0 --判斷如果兩條語句有任何一條出現(xiàn)錯誤
begin rollback tran –開始執(zhí)行事務(wù)的回滾,恢復(fù)的轉(zhuǎn)賬開始之前狀態(tài)
return 0
end
go
select ID
from
table1
where LastUpdateDate =
(select max(LastUpdateDate) from table1)
這是一個典型的“丟失更新”問題。通常的解決方式是提高隔離級別,或者為select加排他鎖。但我推薦下面這種方式,可以在sql server默認的隔離級別和鎖機制下解決問題。
begin?tran
--注意:事務(wù)中的第一句必須是update
update?表名?set?id=id+1?where?...
--獲取原來的id值
declare?@id?int;
select?@id=id-1?from?表名?where?...
利用@id,進行相應(yīng)操作
視情況commit?tran或rollback?tran
核心思路是調(diào)整語句順序,將update放到事務(wù)最開始,利用其排他鎖,阻塞其他并發(fā)事務(wù),保證同一時間只有一個事務(wù)執(zhí)行。
分享名稱:sqlserver更新表事務(wù),更新表內(nèi)容 sql
網(wǎng)站URL:http://chinadenli.net/article22/dsessjc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開發(fā)、電子商務(wù)、標簽優(yōu)化、服務(wù)器托管、商城網(wǎng)站、網(wǎng)站設(shè)計
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)