溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

SQL SERVER 數(shù)據(jù)庫(kù)的鎖

發(fā)布時(shí)間:2020-07-15 11:30:31 來(lái)源:網(wǎng)絡(luò) 閱讀:2412 作者:田峰 欄目:系統(tǒng)運(yùn)維

                                                                        1SQL SERVER 鎖的概念

      共享鎖:用于讀取資源所加的鎖。擁有共享鎖的資源不能被修改。共享鎖在默認(rèn)情況下是讀取了資源馬上被釋放。

      排他鎖:和其他鎖都不兼容,包括其他排他鎖,排它鎖用于修改數(shù)據(jù),當(dāng)資源上加了排他鎖時(shí),其他請(qǐng)求讀取或修改這個(gè)資源的事物都會(huì)被阻塞,直到排他鎖被釋放為止。

      更新鎖:是共享鎖和排它鎖的結(jié)合,用于更新數(shù)據(jù),更新數(shù)據(jù)時(shí)首先需要找到被更新的數(shù)據(jù),此時(shí)可以理解為被查找的數(shù)據(jù)上了共享鎖。當(dāng)找到需要修改的數(shù)據(jù)時(shí),需要對(duì)被修改的資源上排他鎖。

      sql server 通過更新鎖來(lái)避免死鎖的問題,因?yàn)楣蚕礞i和共享鎖是兼容的,通過更新鎖和共享鎖兼容,使得更新查找時(shí)并不影響數(shù)據(jù)查找,而更新鎖和更新鎖之間是不兼容的,從而減少了死鎖的可能性。

舉例說(shuō)明以上描述的鎖:

     1.1. 創(chuàng)建環(huán)境

              ---創(chuàng)建表

                    Createtable student

(

                    studentidint,

                    sname nvarchar(10),

                     sex nchar(1)

                     )

                      --插入學(xué)生

                     insert student values (1,'張飛','')

                     insert student values (2,'甄姬','')

                     insert student values (3,'招新','')

                     insert student values (4,'王五','')

                     insert student values (5,'李四','')


      1.1. 排他鎖

           .新建兩個(gè)連接

           在第一個(gè)連接中執(zhí)行以下語(yǔ)句

                   begintran

                   update dbo.student set sname='王景正' where studentid=1

                   waitfordelay'00:00:30'

                   committran

           在第二個(gè)連接中執(zhí)行以下語(yǔ)句

                   begintran

                   select * from dbo.student where studentid=1

                   committran

            若同時(shí)執(zhí)行上述兩個(gè)語(yǔ)句,select查詢必須等待update執(zhí)行完畢才能執(zhí)行既要等待30

                          

       1.1. 共享鎖

  

             在第一個(gè)連接中執(zhí)行以下語(yǔ)句

                       begintran

                       select * from dbo.student with (holdlock)

                       where sex=''

                       waitfordelay'00:00:30'

                       committran

                     在第二個(gè)連接中執(zhí)行以下語(yǔ)句

                        begintran

                       select studentid,sname from dbo.student where sex=''

                       update dbo.student set sname='韓旭' where sex=''

                       committran

                若同時(shí)執(zhí)行上述兩個(gè)語(yǔ)句,則第二個(gè)連接中的select查詢可以執(zhí)行,UPDATE必須等待地一個(gè)事物釋放

                共享鎖轉(zhuǎn)為排它鎖后才能執(zhí)行,既要等待30.


      1.1. 死鎖

                                      SQL SERVER 數(shù)據(jù)庫(kù)的鎖

                                       SQL SERVER 數(shù)據(jù)庫(kù)的鎖

     1.1. 更新鎖

               

              更新鎖

              在第一個(gè)連接中執(zhí)行以下語(yǔ)句

                        begintran

                        select * from dbo.student with (updlock)where sname='華榮'

                        waitfordelay'00:00:30'

                       update dbo.student set sname='白楠楠'

                      committran

 

                      select * from sys.dm_tran_locks

             在第二個(gè)連接中

                      begintran

                     select * from dbo.student with (updlock) where sname='華榮'

                     waitfordelay'00:00:30'

                              在第二個(gè)連接中如果同樣加更新鎖,則會(huì)阻塞當(dāng)前查詢,直到連接釋放更新鎖。

             如果不加更新鎖則直接可以讀取更新鎖的記錄。

           ,有時(shí)候我需要控制某條記錄在我讀取后就不許再進(jìn)行更新,那么我就可以將所有要處理當(dāng)前記錄的查詢都加上更新鎖,以防止查詢后被其它事務(wù)修改.將事務(wù)的影響降低到最小。

                                

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI