溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SQL SERVER 數據庫的鎖

發布時間:2020-07-15 11:30:31 來源:網絡 閱讀:2461 作者:田峰 欄目:系統運維

                                                                        1SQL SERVER 鎖的概念

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

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

      更新鎖:是共享鎖和排它鎖的結合,用于更新數據,更新數據時首先需要找到被更新的數據,此時可以理解為被查找的數據上了共享鎖。當找到需要修改的數據時,需要對被修改的資源上排他鎖。

      sql server 通過更新鎖來避免死鎖的問題,因為共享鎖和共享鎖是兼容的,通過更新鎖和共享鎖兼容,使得更新查找時并不影響數據查找,而更新鎖和更新鎖之間是不兼容的,從而減少了死鎖的可能性。

舉例說明以上描述的鎖:

     1.1. 創建環境

              ---創建表

                    Createtable student

(

                    studentidint,

                    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. 死鎖

                                      SQL SERVER 數據庫的鎖

                                       SQL SERVER 數據庫的鎖

     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'

                              在第二個連接中如果同樣加更新鎖,則會阻塞當前查詢,直到連接釋放更新鎖。

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

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

                                

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女