首页 > 数据库 >SQL Server锁知识

SQL Server锁知识

时间:2023-07-26 16:28:28浏览次数:42  
标签:begin tran sequence 知识 value Server set SQL select

SQL Server 锁 LOCK

 

数据库引擎存储过程
SET TRANSACTION ISOLATION LEVEL

在多用户的情况下不免要进行并发控制。微软提供了锁机制。
这里锁分为两个部分,一个是锁的范围(行锁、页面锁、表锁),另一个是锁的粒度(共享锁、持有锁等)
服务器带宽,服务器费用,开发人员费用,运维费用,别的没有了吧

NOLOCK、ROWLOCK、UPDLOCK

1、NOLOCK 不加锁
可以查询到记录 (不管是否被锁住,都查询出数据)所以可能会发生读出脏数据的情况,把没有提交事务的数据也显示出来。

select * from test with(nolock)

  

2、HOLDLOCK 保持锁

begin tran

select * from test with(holdlock) where id = 1

rollback

  


3、ROWLOCK 行锁
使用 select * from dbo.A with(RowLock) WHRE a=1 这样的语句,系统是什么时候释放行锁呢??
RowLock 在不使用组合的情况下是没有任何意义的,With(RowLock,UpdLock) 这样的组合才成立,查询出来的数据使用 RowLock 来锁定,当数据被Update的时候,或者回滚之后,锁将被释放。
4、UPDLOCK 更新锁,修改锁
优点: 允许读取数据(不阻塞其它事务)并在以后更新数据,同时确保自从上次读取数据后数据没有被更改。

begin tran
  select * from WebManageUsers with (updlock) where LoginName = 'zzl'
  waitfor delay '00:00:10'
  update WebManageUsers set RealName = 'zzlreal11' where LoginName = 'zzl'
commit tran go begin tran   select * from SYS_DICT with (updlock) where FULLNAME = 'Z'   waitfor delay '00:00:10'   update SYS_DICT set FULLNAME = 'ZZ' commit tran go begin transaction --开始一个事务   select Qty from myTable with (updlock) where Id in (1,2,3)   update myTable SET Qty = Qty - A.Qty from myTable as A inner join @_Table as B on A.ID = B.ID commit transaction --提交事务 go
--案例 create procedure [dbo].[proc_sequence_select]   @count int,   @code varchar(20) AS begin   set nocount on   begin try     begin tran       if @count > 0 and @code is not null         begin           declare @sequence_value bigint           declare @start_value bigint           select @sequence_value = sequence_value from sys_sequence with (updlock) where sequence_code = @code           set @start_value = @sequence_value + 1           set @sequence_value = @sequence_value + @count           update sys_sequence set sequence_code=@sequence_value where sequence_code = @code           select @start_value start_value,@sequence_value stop_value         end       else
        begin           raiserror ( '错误!', 16, 1)         end     commit tran   end try   begin catch     rollback tran     --错误消息     declare @msg nvarchar(max);     set @msg = error_message();     --insert into sys_error_message values( '错误类型',@msg, '错误数据', getdate());     raiserror ( @msg, 16, 1);   end catch; end

  

5、READPAST
被锁住的记录不能查询出来。

select * from test ip with(readpast)
select * from test with(readpast)

  

6、TABLOCK 表锁

7、PAGLOCK 页锁

8、TABLOCKX 排它表锁
排它 (X) 锁可以防止并发事务对资源进行访问。其它事务不能“读取”或“修改”排它 (X) 锁锁定的数据。 

9、对应用程序资源设置锁
sp_getapplock

--锁定应用程序资源

begin tran;

    declare @result int;
    exec @result = sp_getapplock @Resource = 'Form1',@LockMode = 'Shared';

commit tran;

  

10、为应用程序资源释放锁
sp_releaseapplock

--为应用程序资源解锁

exec sp_releaseapplock @DbPrincipal = 'dbo', @Resource = 'Form1';

  

11、锁一个表的某一行

 

--可选参数【committed】【uncommitted】【read】【serializable】

set transaction isolation level read uncommitted

select * from test rowlock where id = 1

12、查询锁

select

request_session_id spid

,OBJECT_NAME(resource_associated_entity_id) tableName

from sys.dm_tran_locks where resource_type='OBJECT'

  

13、解锁

declare @spid int

set @spid = 57 --锁表进程

declare @sql varchar(1000)

set @sql='kill '+cast(@spid as varchar)

exec(@sql)

  

标签:begin,tran,sequence,知识,value,Server,set,SQL,select
From: https://www.cnblogs.com/Leo_wl/p/17582764.html

相关文章

  • arcgis for js 4.x 加载 geoserver WMS WMTS
    arcgisforjs4.x加载geoserverwms代码如下<html><head><metacharset="utf-8"/><metaname="viewport"content="initial-scale=1,maximum-scale=1,user-scalable=no"/><ti......
  • mysql5.7 centos7 xtrabackup步骤
    mysql5.7centos7xtrabackup步骤wgethttps://downloads.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.28/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.28-1.el7.x86_64.rpmyuminstallcmakegccgcc-c++libaiolibaio-develautomake......
  • code-server观看图片
    在code-server上解决无法显示图片的问题记录该笔记的由来  因为学校集群创建作业后,也就是提交创建服务器,采用的vscode和jupyter,采用深度学习网络部署在服务器上进行训练,但是之前一直是把图片下载在本地看结果,无法直观的看到结果,可以通过ssh连接也行,但是博主自身的没有搞好用v......
  • ol 加载geoserver wms wmts mvt
    ol加载geoserverwms代码如下<!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>geoserver-wms</title><linkhref="https://cdn.bootcdn.net/ajax/libs/openlayers/4.6.5/o......
  • 【面试必背知识】Java 中常见的异常有哪些?
    ......
  • SqlServer将数据库中的表复制到另一个数据库;SqlServer怎样把一个数据库的数据复制粘贴
     一.复制表结构1.首先,打开并连接SqlServer,在源数据库Source_db(源数据库名称)上右键,然后依次点击“编写表脚本为”→“Create到”→“新查询编辑器窗口”。 2.在第1步产生的编辑器中按”crtl+a“组合键全选内容,然后右键“复制“(或按"crtl+c"键)。 3.新建查询,然后右键”粘......
  • centos7 用docker 部署 nacos集群--以mysql持久化--以nginx代理
     创建一个文件夹,把四个配置文件放进去,然后运行:dockercompose-f-dnacos.ymlupmysql-schema.sqlnacos.confnacos.envnacos.yml  mysql-schema.sql内容:/**Copyright1999-2018AlibabaGroupHoldingLtd.**LicensedundertheApacheLicense,Version2.......
  • docker小知识
    文件拷贝用于在主机与容器之间拷贝文件或目录#从容器中拷贝至主机#dockercp<container>:<容器目录><主机目录>dockercpubuntu:/data/c/tmp#从主机拷贝至容器dockercp<主机目录><container>:/<容器目录>dockercp/c/tmpubuntu:/data容器中联通主机的docke......
  • Android应用程序主要组件知识小结
    Android系统中通过几个主要的组件以其灵活的组织方式在方便了开发者的同时,也不失其炫丽的效果,实在是值得我不断深入了解和学习,下面的图作为近一段时间对Android组件知识的一个小结,难免有遗漏或错误之处,敬请各位不吝赐教。我觉得深刻理解和掌握这几个组件的使用方法以及相互关系,就......
  • 算法学习--并查集相关知识及例题
    一、并查集的定义二、基本操作1、初始化一开始,每个元素都是独立的集合#include<iostream>usingnamespacestd;constintmaxN=1000;intfather[maxN];intmain(){for(inti=1;i<=maxN;i++){father[i]=i;}return0;}2、查找递推版本://返......