SQL SERVER 數據庫的鎖

                                                                        1SQL SERVER 鎖的概念sql

      共享鎖:用於讀取資源所加的鎖。擁有共享鎖的資源不能被修改。共享鎖在默認狀況下是讀取了資源立刻被釋放。ide

      排他鎖:和其餘鎖都不兼容,包括其餘排他鎖,排它鎖用於修改數據,當資源上加了排他鎖時,其餘請求讀取或修改這個資源的事物都會被阻塞,直到排他鎖被釋放爲止。spa

      更新鎖:是共享鎖和排它鎖的結合,用於更新數據,更新數據時首先須要找到被更新的數據,此時能夠理解爲被查找的數據上了共享鎖。當找到須要修改的數據時,須要對被修改的資源上排他鎖。server

      sql server 經過更新鎖來避免死鎖的問題,由於共享鎖和共享鎖是兼容的,經過更新鎖和共享鎖兼容,使得更新查找時並不影響數據查找,而更新鎖和更新鎖之間是不兼容的,從而減小了死鎖的可能性。圖片

舉例說明以上描述的鎖:事務

     1.1. 建立環境

              ---建立表資源

                    Createtable studentit

(table

                    studentidint,class

                    sname nvarchar(10),

                     sex nchar(1)

                     )

                      --插入學生

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

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

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

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

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


      1.1. 排他鎖

           .新建兩個鏈接

           在第一個鏈接中執行如下語句

                   begintran

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

                   waitfordelay'00:00:30'

                   committran

           在第二個鏈接中執行如下語句

                   begintran

                   select * from dbo.student where studentid=1

                   committran

            若同時執行上述兩個語句,select查詢必須等待update執行完畢才能執行既要等待30

                          

       1.1. 共享鎖

  

             在第一個鏈接中執行如下語句

                       begintran

                       select * from dbo.student with (holdlock)

                       where sex=''

                       waitfordelay'00:00:30'

                       committran

                     在第二個鏈接中執行如下語句

                        begintran

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

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

                       committran

                若同時執行上述兩個語句,則第二個鏈接中的select查詢能夠執行,UPDATE必須等待地一個事物釋放

                共享鎖轉爲排它鎖後才能執行,既要等待30.


      1.1. 死鎖

                                      圖片1.png

                                       圖片2.png

     1.1. 更新鎖

               

              更新鎖

              在第一個鏈接中執行如下語句

                        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

             在第二個鏈接中

                      begintran

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

                     waitfordelay'00:00:30'

                              在第二個鏈接中若是一樣加更新鎖,則會阻塞當前查詢,直到鏈接釋放更新鎖。

             若是不加更新鎖則直接能夠讀取更新鎖的記錄。

           ,有時候我須要控制某條記錄在我讀取後就不準再進行更新,那麼我就能夠將全部要處理當前記錄的查詢都加上更新鎖,以防止查詢後被其它事務修改.將事務的影響下降到最小。

相關文章
相關標籤/搜索