[點(diǎn)晴永久免費(fèi)OA]如何解決并發(fā)的問(wèn)題(SQL鎖的使用)
--設(shè)tb(A,B,C)
create table #tb(A varchar(2),B varchar(2),C varchar(2)) insert into #tb select ''a1'',''b1'',''c1'' union all select ''a2'',''b2'',''c2'' union all select ''a3'',''b3'',''c3'' /********** 加鎖 *************** 設(shè)table1(A,B,C) A B C a1 b1 c1 a2 b2 c2 a3 b3 c3 1)排它鎖 新建兩個(gè)連接 在第一個(gè)連接中執(zhí)行以下語(yǔ)句 begin tran update table1 set A=''aa'' where B=''b2'' waitfor delay ''00:00:30'' --等待30秒 commit tran 在第二個(gè)連接中執(zhí)行以下語(yǔ)句 begin tran select * from table1 where B=''b2'' commit tran 若同時(shí)執(zhí)行上述兩個(gè)語(yǔ)句,則select查詢必須等待update執(zhí)行完畢才能執(zhí)行即要等待30秒 2)共享鎖 在第一個(gè)連接中執(zhí)行以下語(yǔ)句 begin tran select * from table1 holdlock -holdlock人為加鎖 where B=''b2'' waitfor delay ''00:00:30'' --等待30秒 commit tran 在第二個(gè)連接中執(zhí)行以下語(yǔ)句 begin tran select A,C from table1 where B=''b2'' update table1 set A=''aa'' where B=''b2'' commit tran 若同時(shí)執(zhí)行上述兩個(gè)語(yǔ)句,則第二個(gè)連接中的select查詢可以執(zhí)行 而update必須等待第一個(gè)連接中的共享鎖結(jié)束后才能執(zhí)行 即要等待30秒 3)死鎖 增設(shè)table2(D,E) D E d1 e1 d2 e2 在第一個(gè)連接中執(zhí)行以下語(yǔ)句 begin tran update table1 set A=''aa'' where B=''b2'' waitfor delay ''00:00:30'' update table2 set D=''d5'' where E=''e1'' commit tran 在第二個(gè)連接中執(zhí)行以下語(yǔ)句 begin tran update table2 set D=''d5'' where E=''e1'' waitfor delay ''00:00:10'' update table1 set A=''aa'' where B=''b2'' commit tran 同時(shí)執(zhí)行,系統(tǒng)會(huì)檢測(cè)出死鎖,并中止進(jìn)程 該文章在 2020/3/3 1:49:14 編輯過(guò) |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |