8.3锁定

锁定和并发
  8.3锁定
    Sql Server有几种不同的方式来锁定数据
      举例来说
        更新锁在更新操作的开头部分获取
        读操作获取共享锁,而写操作获取排它锁
    两种独立的锁定体系
      分类
        第一种影响所有完全共享的数据,并提供行级锁、分页锁、表、数据分页、LOB分页以及索引分页级别上的表级锁
        第二种SQL server 内部使用,用来处理索引并发控制,管理对于内部数据结构的访问,以及获取数据分页的个别记录,第二种系统采用闩latch,比锁要少耗资源并能提供性能优化
      区别
        锁保证逻辑一致性
        闩保证物理一致性
    自旋锁
    用户数据的锁定类型
      概念
        锁的粒度granularity
          行
          分页
          一个索引键
          索引键的一个范围
          一个扩展
          表
        锁的所有权scope
          会话
          事务
          游标
      锁的模式
        分类
          共享锁shared lock
            当数据被读取时,sql server自动获取共享锁
            共享锁可以被一张表、一个分页、一个索引键、或一个单独的行所持有
            许多进程可以在同一数据上持有共享锁,但是没有进程可以在已经有一个共享锁存在的情况下,在该数据上获取排它锁
            一般地当一个数据被读取完毕之后,共享锁立即释放,但是可以使用查询提示或不同的事务隔离级别改变这种默认行为
          排它锁exclusive lock
            当数据被插入、修改、或删除以后,sql server 会自动获取数据上的排它锁
            一次只能有一个进程持有特定数据资源上的排它锁
            如果别的进程已经排他性地锁定住某个进程所要申请的数据资源,那么该进程无法获取任何类型的锁
            排它锁会保留到事务结束为止
            这就意味着被修改的数据通常在当前事务提交或回滚之前对其他进程来说是不可用的
            其他进程可以通过查询提示来读取排他性锁定的数据
          更新锁update lock
            实际上并不是一种独立的锁,他们是共享锁和排它锁的混合
            当sql server执行一个数据修改操作,但首先需要搜索表以寻找到要被修改的资源时,更新锁就会被获取
            通过使用查询提示,一个进程可以明确的申请更新锁
            提供对其他数据读者的兼容性,在确保数据自上次读取以后尚未修改的前提下,是进程能够在稍后对数据进行修改。
            更新锁不足以使用户修改数据,所有的数据修改都要求被修改的资源上存在排它锁
            更新锁的作用就好像一个串行化阀门,将后续申请排它锁的请求压入队列中
            只要有一个进程对资源持有更新锁,其他进程就无法获取该资源的更新锁或排它锁
            而其他正在申请相同资源的更新锁或排它锁就必须等待
            持有更新锁的进程可以将其转换为排它锁,因为更新锁避免了与其他进程的锁的兼容性
            可以将更新锁看作意图更新intent to update
            更新锁一直保留到事务结束,或转化为排他锁
            SQL server使用更新锁适用于任何需要在进行实际修改之前搜索数据的数据修改操作
              这样的操作包括受限更新和删除
              也包括带有聚集索引的表进行插入操作
                sql Server必须先搜索数据(使用聚集索引)以找到正确的位置来插入新的记录
                当sql server 只进行到搜索阶段时,它会采用更新锁来保护数据,而只有它找到正确的位置并开始插入以后才将更新锁升级为排它锁
          意向锁intent lock
          特殊锁定方式
            架构稳定锁schema stability locks
              当查询被编译时,架构稳定锁会防止其他进程获取架构修改锁
            架构更改锁schema modification locks
            大容量更新锁bulk update locks
              当执行bulk insert 或bcp工具将数据导入表时就会获取大容量更新锁
              大容量导入操作必须使用tablock查询提示来获取这个特殊的锁
        锁的模式决定了一个并发请求的锁是否兼容

时间: 2024-10-19 06:32:22

8.3锁定的相关文章

用Python 编写的清除U8系统单据锁定的脚本

经常被财务打电话过来要求解除锁定,头疼,要远程到服务器上,打开迟钝的sql 2005管理器复制两条解除锁定的任务,事情一忙就会忘记,免不了被第二次催,在网上下载的清除锁定的工具好像只能用在"畅捷通T6,T3"上,U8不能用.就想着做个小脚本或者程序,想起来之前有个codematic可以把sql语句自动生成为C#代码.可打开软件后,发现对C#如何新建工程和编译,一点都不懂. 想起来网上说的"一个功能,用C来写,可能要100行,用JAVA要20行,而用 Python只需要5行&q

引用账户当前已锁定,且可能无法登录”--问题的解决方法(转载)

indows 7下面,登录到另外一个AD域里面更改网络密码时遇到了错误,"引用账户当前已锁定,且可能无法登录",如下图,经反复摸索,最后找到解决方法. 点击"开始"->"运行",输入gpedit.msc并回车打开"组策略",依次展开:计算机配置-windows设置-安全设置-帐户策略-帐户锁定策略中找"帐户锁定阀值",双击,数值设置选0,确定.

SQL Server中如何定位Row Lock锁定哪一行数据

在SQL Server中有时候会使用提示(Hint)强制SQL使用行锁(Row Lock),前两天有个同事咨询了一个问题,如何定位Row Lock具体锁定了哪一行.其实这个问题只适合研究一下,实际意义并不大,因为找到.定位被锁定的行的代价开销较大,而意义却不怎么大,而且使用场景也很少.那么下面我们来探讨.研究一下这个问题吧: 在会话窗口(会话ID=65)下执行下面SQL语句,模拟SQL Server使用行锁锁定某一行记录: USE AdventureWorks2012; GO   SELECT 

最近开始努力学python 写了一个python小代码:判断一个登陆程序,如果账号密码输错3次,锁定账号无法再登陆

1 count = 0 2 username = 'zhangsan' 3 userpassword = '111111' 4 5 f = open('lock.txt','r+') 6 file_list = f.readlines() 7 f.close() 8 #打开文件夹 读取数据 9 10 name = input("请输入用户名:") 11 12 if name in file_list: 13 print("您的账号被锁定!") 14 #判断文件夹中的

centos7 搭建vsftpd服务并锁定用户的家目录

1.安装vsftpd服务 yum install vsftpd -y 2.创建用户 useradd vsftp -s /sbin/nologin ####添加用户,并且这个用户没有登陆系统的权限passwd vsftp 3.修改vsftp配置文件 [[email protected] home]# vim /etc/vsftpd/vsftpd.conf 把其中的某些注释取消 chroot_local_user=YES ####锁定本地用户的家目录,但是目录本身的w权限要取消.这是安全考虑,若不取

作业一:登录界面(优化,能读取锁定文件中的任意用户名,一旦发现所输入的用户名是锁定文件中的,立即告知并跳出循环)

1 #Author:AXIN 2 #功能:登录窗口 3 # 1.输入用户名,密码 4 # 2.认证成功后输出提示信息,表示欢迎 5 # 3.输错3次后锁定用户名(写入文件) 6 _name = 'AXIN' 7 _password = '123qwe' 8 temp = 0 9 count_2 = 0 10 lock_flag = 0 11 12 name = input("Name:") 13 password = input("Password:") 14 15

实现用户登录并且输入错误三次后锁定该用户

我的测试环境,win7,python3.6,Pycharm社区版 提示输入用户名,和密码 判断是否被锁定 判断用户名和密码是否匹配 输入错误三次,账号被锁定 real_user = 'channel' #正确的用户名 real_passwd = 'asdf' #正确的密码 lock_user = ['tiaozhan'] #锁定账号列表 while True: user_input = input("输入用户名") passwd_input = input('your passwd:'

yum锁定强行解锁

Another app is currently holding the yum lock; waiting for it to exit...  The other application is: PackageKit    Memory : 153 M RSS (266 MB VSZ)    Started: Thu Jul 12 00:03:05 2012 - 06:19 ago State  : Sleeping, pid: 4018 解决方法: rm -rf /var/run/yum.

python装饰器:实现登录账户三次失败,账户自动锁定

1.定义无参装饰器为被装饰器添加统计运行时间的功能2.定义有参装饰器为被装饰器添加认证功能:用户的信息可以来源于file也可以是ldap,三次验证失败锁定用户 同http://www.cnblogs.com/xuyaping/p/6679305.html,只不过加了装饰器统计时间和认证功能.  

第二周作业__三次锁定

html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption