温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

SQL SERVER 数据库的锁

发布时间:2020-07-15 11:30:31 来源:网络 阅读:2421 作者:田峰 栏目:系统运维

                                                                        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