锁的概述

两个事物 update同一张表出现的死锁问题 多个事务同时更新表(无论一张还是多张)都要注意u锁和x锁! 引言 近来做省一级计算机一级考试系统的时候,学生端进行大批量判分的时候,出现了这样的问题(事务(进程 ID 262)与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。请重新运行该事务。): 这个就是我们在代码中写了大批量的update语句,用trace Profiler ,我们对死锁追踪是这样的: ... 阅读详情

一. 为什么要引入锁 
  多个用户同时对数据库的并发操作时会带来以下数据不一致的问题: 
  丢失更新
  A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了另一个修改的结果,比如订票系统 
  脏读
  A用户修改了数据,随后B用户又读出该数据,但A用户因为某些原因取消了对数据的修改,数据恢复原值,此时B得到的数据就与数据库内的数据产生了不一致 
  不可重复读
  A用户读取数据,随后B用户读出该数据并修改,此时A用户再读取数据时发现前后两次的值不一致 
  并发控制的主要方法是封锁,锁就是在一段时间内禁止用户做某些操作以避免产生数据不一致 

二 锁的分类 
  锁的类别有两种分法: 
  1. 从数据库系统的角度来看:分为独占锁(即排它锁),共享锁和更新锁 
  MS SQL Server 使用以下资源锁模式。 
  锁模式 描述 
  共享 (S) 用于不更改或不更新数据的操作(只读操作),如 SELECT 语句。 
  更新 (U) 用于可更新的资源中。防止当多个会话在读取、锁定以及随后可能进行的资源更新时发生常见形式的死锁。
  排它 (X) 用于数据修改操作,例如 INSERT、UPDATE 或 DELETE。确保不会同时同一资源进行多重更新。 
  意向锁 用于建立锁的层次结构。意向锁的类型为:意向共享 (IS)、意向排它 (IX) 以及与意向排它共享 (SIX)。 
  架构锁 在执行依赖于表架构的操作时使用。架构锁的类型为:架构修改 (Sch-M) 和架构稳定性 (Sch-S)。 
  大容量更新 (BU) 向表中大容量复制数据并指定了 TABLOCK 提示时使用。 
  共享锁
   共享 (S) 锁允许并发事务读取 (SELECT) 一个资源。资源上存在共享 (S) 锁时,任何其它事务都不能修改数据。一旦已经读取数据,便立即释放资源上的共享 (S) 锁,除非将事务隔离级别设置为可重复读或更高级别,或者在事务生存周期内用锁定提示保留共享 (S) 锁。 
  更新锁
  更新 (U) 锁可以防止通常形式的死锁。一般更新模式由一个事务组成,此事务读取记录,获取资源(页或行)的共享 (S) 锁,然后修改行,此操作要求锁转换为排它 (X) 锁。如果两个事务获得了资源上的共享模式锁,然后试图同时更新数据,则一个事务尝试将锁转换为排它 (X) 锁。共享模式到排它锁的转换必须等待一段时间,因为一个事务的排它锁与其它事务的共享模式锁不兼容;发生锁等待。第二个事务试图获取排它 (X) 锁以进行更新。由于两个事务都要转换为排它 (X) 锁,并且每个事务都等待另一个事务释放共享模式锁,因此发生死锁。 
  若要避免这种潜在的死锁问题,请使用更新 (U) 锁。一次只有一个事务可以获得资源的更新 (U) 锁。如果事务修改资源,则更新 (U) 锁转换为排它 (X) 锁。否则,锁转换为共享锁。 
  排它锁
  排它 (X) 锁可以防止并发事务对资源进行访问。其它事务不能读取或修改排它 (X) 锁锁定的数据。 
  意向锁
   意向锁表示 SQL Server 需要在层次结构中的某些底层资源上获取共享 (S) 锁或排它 (X) 锁。例如,放置在表级的共享意向锁表示事务打算在表中的页或行上放置共享 (S) 锁。在表级设置意向锁可防止另一个事务随后在包含那一页的表上获取排它 (X) 锁。意向锁可以提高性能,因为 SQL Server 仅在表级检查意向锁来确定事务是否可以安全地获取该表上的锁。而无须检查表中的每行或每页上的锁以确定事务是否可以锁定整个表。 
  意向锁包括意向共享 (IS)、意向排它 (IX) 以及与意向排它共享 (SIX)。 
  锁模式 
  描述
  意向共享 (IS) 通过在各资源上放置 S 锁,表明事务的意向是读取层次结构中的部分(而不是全部)底层资源。 
   意向排它 (IX) 通过在各资源上放置 X 锁,表明事务的意向是修改层次结构中的部分(而不是全部)底层资源。IX 是 IS 的超集。与意向排它共享 (SIX) 通过在各资源上放置 IX 锁,表明事务的意向是读取层次结构中的全部底层资源并修改部分(而不是全部)底层资源。允许顶层资源上的并发 IS 锁。例如,表的 SIX 锁在表上放置一个 SIX 锁(允许并发 IS 锁),在当前所修改页上放置 IX 锁(在已修改行上放置 X 锁)。虽然每个资源在一段时间内只能有一个 SIX 锁,以防止其它事务对资源进行更新,但是其它事务可以通过获取表级的 IS 锁来读取层次结构中的底层资源。 
  独占锁:只允许进行锁定操作的程序使用,其他任何对他的操作均不会被接受。执行数据更新命令时,SQL Server会自动使用独占锁。当对象上有其他锁存在时,无法对其加独占锁。
  共享锁:共享锁锁定的资源可以被其他用户读取,但其他用户无法修改它,在执行Select时,SQL Server会对对象加共享锁。
  更新锁:当SQL Server准备更新数据时,它首先对数据对象作更新锁锁定,这样数据将不能被修改,但可以读取。等到SQL Server确定要进行更新数据操作时,他会自动将更新锁换为独占锁,当对象上有其他锁存在时,无法对其加更新锁。 
  2. 从程序员的角度看:分为乐观锁和悲观锁。
  乐观锁:完全依靠数据库来管理锁的工作。
  悲观锁:程序员自己管理数据或对象上的锁处理。 
  MS SQL Server 使用锁在多个同时在数据库内执行修改的用户间实现悲观并发控制 
  三 锁的粒度
  锁粒度是被封锁目标的大小,封锁粒度小则并发性高,但开销大,封锁粒度大则并发性低但开销小 
  SQL Server支持的锁粒度可以分为为行、页、键、键范围、索引、表或数据库获取锁 
  资源描述 
  RID 行标识符。用于单独锁定表中的一行。 
  键 索引中的行锁。用于保护可串行事务中的键范围。 
  页 8 千字节 (KB) 的数据页或索引页。 
  扩展盘区 相邻的八个数据页或索引页构成的一组。 
  表 包括所有数据和索引在内的整个表。 
  DB 数据库。 
  四 锁定时间的长短 
  锁保持的时间长度为保护所请求级别上的资源所需的时间长度。 
   用于保护读取操作的共享锁的保持时间取决于事务隔离级别。采用 READ COMMITTED 的默认事务隔离级别时,只在读取页的期间内控制共享锁。在扫描中,直到在扫描内的下一页上获取锁时才释放锁。如果指定 HOLDLOCK 提示或者将事务隔离级别设置为 REPEATABLE READ 或 SERIALIZABLE,则直到事务结束才释放锁。 
  根据为游标设置的并发选项,游标可以获取共享模式的滚动锁以保护提取。当需要滚动锁时,直到下一次提取或关闭游标(以先发生者为准)时才释放滚动锁。但是,如果指定 HOLDLOCK,则直到事务结束才释放滚动锁。 
  用于保护更新的排它锁将直到事务结束才释放。 
  如果一个连接试图获取一个锁,而该锁与另一个连接所控制的锁冲突,则试图获取锁的连接将一直阻塞到: 
  将冲突锁释放而且连接获取了所请求的锁。 
  连接的超时间隔已到期。默认情况下没有超时间隔,但是一些应用程序设置超时间隔以防止无限期等待 
  五 SQL Server 中锁的自定义 
  1 处理死锁和设置死锁优先级 
   死锁就是多个用户申请不同封锁,由于申请者均拥有一部分封锁权而又等待其他用户拥有的部分封锁而引起的无休止的等待可以使用SET DEADLOCK_PRIORITY控制在发生死锁情况时会话的反应方式。如果两个进程都锁定数据,并且直到其它进程释放自己的锁时,每个进程才能释放自 己的锁,即发生死锁情况。 
  2 处理超时和设置锁超时持续时间。 
  @@LOCK_TIMEOUT 返回当前会话的当前锁超时设置,单位为毫秒 
  SET LOCK_TIMEOUT 设置允许应用程序设置语句等待阻塞资源的最长时间。当语句等待的时间大于 LOCK_TIMEOUT 设置时,系统将自动取消阻塞的语句,并给应用程序返回"已超过了锁请求超时时段"的 1222 号错误信息 
  示例
  下例将锁超时期限设置为 1,800 毫秒。
SET LOCK_TIMEOUT 1800


  3) 设置事务隔离级别。 
  4 ) 对 SELECT、INSERT、UPDATE 和 DELETE 语句使用表级锁定提示。 
  5) 配置索引的锁定粒度
  可以使用 sp_indexoption 系统存储过程来设置用于索引的锁定粒度 
六 查看锁的信息   1 执行 EXEC SP_LOCK 报告有关锁的信息
  2 查询分析器中按Ctrl+2可以看到锁的信息 
  七 使用注意事项 
  如何避免死锁
  1 使用事务时,尽量缩短事务的逻辑处理过程,及早提交或回滚事务;
  2 设置死锁超时参数为合理范围,如:3分钟-10分种;超过时间,自动放弃本次操作,避免进程悬挂;
  3 优化程序,检查并避免死锁现象出现;
  4 .对所有的脚本和SP都要仔细测试,在正是版本之前。
  5 所有的SP都要有错误处理(通过@error)
  6 一般不要修改SQL Server事务的默认级别。不推荐强行加锁  
  八 几个有关锁的问题 
  1 如何锁一个表的某一行 
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTEDSELECT * FROM table ROWLOCK WHERE id =
1

  2 锁定数据库的一个表 
SELECT * FROM table WITH (HOLDLOCK) 

  加锁语句:
sybase:update 表 set col1=col1 where 1=0 ;MS SQL:select col1 from 表 (tablockx) where 1=0 ;oracle:LOCK TABLE 表 IN EXCLUSIVE MODE ;

  加锁后其它人不可操作,直到加锁用户解锁,用commit或rollback解锁 

  几个例子帮助大家加深印象,设table1(A,B,C)
A B C 
a1 b1 c1 
a2 b2 c2 
a3 b3 c3 


  1)排它锁
  新建两个连接,在第一个连接中执行以下语句
begin tranupdate table1set A='aa'where B='b2'waitfor delay '00:00:30'
--等待30秒commit tran

  在第二个连接中执行以下语句
begin transelect * from table1where B='b2'commit tran 

  若同时执行上述两个语句,则select查询必须等待update执行完毕才能执行即要等待30秒 
  2)共享锁
  在第一个连接中执行以下语句
begin transelect * from table1 holdlock -holdlock人为加锁where B='b2'waitfor delay '00:00:30'
--等待30秒commit tran 

  在第二个连接中执行以下语句
begin transelect A,C from table1where B='b2'update table1set A='aa'where B='b2'commit tran 

  若同时执行上述两个语句,则第二个连接中的select查询可以执行,而update必须等待第一个事务释放共享锁转为排它锁后才能执行 即要等待30秒 
  3)死锁
  增设table2(D,E)
D E
 
d1 e1 
d2 e2
 


  在第一个连接中执行以下语句
begin tranupdate table1set A='aa'where B='b2'waitfor delay '00:00:30'update table2set D='d5'where E='e1'commit tran

  在第二个连接中执行以下语句
begin tranupdate table2set D='d5'where E='e1'waitfor delay '00:00:10'update table1set A='aa'where B='b2'commit tran 

  同时执行,系统会检测出死锁,并中止进程 
  补充一点:
  SQL Server 2000支持的表级锁定提示 
  HOLDLOCK 持有共享锁,直到整个事务完成,应该在被锁对象不需要时立即释放,等于SERIALIZABLE事务隔离级别 
  NOLOCK 语句执行时不发出共享锁,允许脏读 ,等于 READ UNCOMMITTED事务隔离级别 
  PAGLOCK 在使用一个表锁的地方用多个页锁 
  READPAST 让SQL Server跳过任何锁定行,执行事务,适用于READ UNCOMMITTED事务隔离级别只跳过RID锁,不跳过页,区域和表锁 
  ROWLOCK 强制使用行锁 
  TABLOCKX 强制使用独占表级锁,这个锁在事务期间阻止任何其他事务使用这个表 
  UPLOCK 强制在读表时使用更新而不用共享锁 
  应用程序锁:
  应用程序锁就是客户端代码生成的锁,而不是SQL Server本身生成的锁 
  处理应用程序锁的两个过程 
  sp_getapplock 锁定应用程序资源 
  sp_releaseapplock 为应用程序资源解锁 
  注意: 锁定数据库的一个表的区别 
  SELECT * FROM table WITH (HOLDLOCK) 其他事务可以读取表,但不能更新删除 
  SELECT * FROM table WITH (TABLOCKX) 其他事务不能读取表,更新和删除

Unity URP项目里Post Processing死活没效果?别慌,这5个坑我帮你踩过了 本文详细解析了Unity URP项目中Post Processing效果失效的五大常见问题,包括渲染管线配置冲突、Volume作用域误判、摄像机参数漏配、Layer层级冲突和Profile引用异常。通过实际项目案例和代码示例,提供专业级解决方案,帮助开发者快速排查并修复后处理效果不生效的问题。 阅读详情

相关推荐

ARTIX-7 GTP 3G-SDI 工程构建与调试实战

本文详细介绍了基于ARTIX-7 FPGA和GTP收发器的3G-SDI工程构建与调试实战。从基础概念解析到Vivado工程创建、GTP IP核配置、SDI IP核集成,再到系统集成与时钟域处理,提供了全面的技术指导。文章还分享了调试技巧、常见问题排查方法以及性能验证步骤,帮助开发者快速掌握3G-SDI视频传输技术的实现与优化。

weixin_30443813的博客 256

修改表结构导致表打不开(死锁)

1.出现场景 一个同事在执行一个代码的时候,对A表进行大量的查询,我在这时候,正好需要对这个表中的某一个的字段进行相应的修改,也就是 alert table 的操作,我在执行的时候,发现数据库卡住了,然后执行强制退出了数据库的链接工具,在进去数据库的时候,就发现了大量的sql语句发生了阻塞的问题。 出现了这种 Waiting for table metadata lock的等待场景,导致了后台服务查询缓慢,卡住。 2.原因分析 因为 alter table的时候导致锁表,查询的时候,就进行了排队,发生了阻塞

一滴水的眼泪 1606

【NTN 卫星通信】使用地面网络和卫星网络接入的终端应用场景

卫星接入有广覆盖的特点, 可以改善地面接入网覆盖或无线条件差的地区(例如多径干扰)的服务可用性。对于高速移动中需要实时业务的终端,如IMS语音/视频会议,可以通过地面接入和卫星接入同时实现与5G系统的双连接,在地面接入网不可用的情况下获得连续可靠的业务。

weixin_43603524的博客 2558

第二十节: 深入理解并发机制以及解决方案(锁机制、EF自有机制、队列模式等)

一. 理解并发机制 1. 什么是并发,并发与多线程有什么关系? ①. 先从广义上来说,或者从实际场景上来说.   高并发通常是海量用户同时访问(比如:12306买票、淘宝的双十一抢购),如果把一个用户看做一个线程的话那么并发可以理解成多线程同时访问,高并发即海量线程同时访问。 (ps:我们在这里模拟高并发可以for循环多个线程即可) ②.从代码或数据的层次上来说.   多个...

sinolover的专栏 771

3分钟搞懂欧式距离变换(EDT):从暴力算法到Felzenszwalb的演进史

本文系统梳理了欧式距离变换(EDT)从暴力算法到高效线性算法的演进历程。重点解析了光栅扫描算法和Felzenszwalb算法的核心思想与实现,并探讨了其在机器人路径规划中生成欧几里得符号距离场(ESDF)的关键应用,为开发者提供了清晰的算法选型与实战指南。

fern8的博客 976

miRNA测序数据生信分析——第一讲,总结概述

这里的miRNA测序指转录水平的测序。这里每一个数据库都可以在线访问,但是如果要本地使用,都需要进行数据库文件下载,整理。

weixin_44616693的博客 4953

MySQL 锁机制

学习 尚硅谷MySQL高级 周阳老师视频,总结笔记。 概述 定义 锁是计算机协调多个进程或线程并发访问某一资源的机制。 在数据库中,除传统的计算资源(如CPU、RAM、I/O等)的争用外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也...

无关风月 575

RK3588与银河麒麟V10 SP1 2403深度适配:国产化硬件与操作系统的完美融合

本文深入探讨了RK3588处理器与银河麒麟V10 SP1 2403操作系统的深度适配,展示了国产化硬件与操作系统的完美融合。通过性能验证和实际应用测试,证明了这套组合在多媒体处理、AI推理和日常办公中的卓越表现,实现了完全自主可控的计算平台。

weixin_29194255的博客 249

MySQL锁概述

我们在操作数据库的时候,可能会由于并发问题而引起的数据的不一致性(数据冲突),如何保证数据并发访问的一致性、有效性,是所有数据库必须解决的一个问题,锁的冲突也是影响数据库并发访问性能的一个重要因素,从这一角度来说,锁对于数据库而言就显得尤为重要。 今天就分享下MySQL相关的最全锁,希望你学习后能更好的掌握数据库锁。 MySQL锁概述 相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特...

zjy1211079133的博客 4314

【AMD显卡在WIndow10/11部署带GPU支持的深度学习环境(Pytorch-DirectML篇)】

这篇是之前Tensorflow-DirectML的姊妹篇,如果对TF感兴趣的可以搜索我的博文。 首先我们丢一个官网地址,但是官网那个会误导新人如果你按那个操作的话。 https://docs.microsoft.com/en-us/windows/ai/directml/gpu-pytorch-windows 这里用我的方法操作: 首先声明一下,因为我的显卡是AMD RX6600,不带XT(性能和RTX3060 12G版本半斤八两),所以目前没有最新的WSL2驱动,如果有了的话欢迎告知我,所以我这里就.

weixin_44029053的博客 2万+

基于物联网设计温室水培系统(NBIOT+华为云IOT)_338

本项目设计并实现了一套基于物联网的温室水培系统。系统以STM32F103RCT6单片机为核心控制器,结合SHT30温湿度传感器、SGP30二氧化碳传感器、BH1750光照传感器及液位检测传感器等硬件,实现对温室内环境参数的实时采集。系统支持自动和手动两种控制模式,能够根据传感器数据自动控制补光灯、通风风扇、遮光卷帘、降温水帘及营养液补充电机。通过NBIoT模块,系统可将采集的数据通过MQTT协议上传至华为云IOT平台,用户可通过Android手机APP或Windows上位机进行远程监控与控制。

413

各种锁概述

主要是了解我们经常遇到的各种锁 重量级锁 进程或者线程想访问某个资源,如果没有线程访问,则占有这个资源,且加上锁,等用完之后再释放掉锁。如果这个资源被其他线程占有,就会堵塞,直到其他线程让出该资源并唤醒该线程。 自旋锁 把线程从运行态转为阻塞态,会保存上下文,涉及到内核态到用户态的转换,非常浪费时间,被其他线程唤醒,也很消耗时间。在重量级锁的情况下,假如该线程访问某个资源,该资源别占用,所以就得转化为阻塞,但可能0.001秒之后,占有该资源的线程就会释放掉锁。所有如果多等一点时间,浪费的时间反而会更

miss_na的博客 186

TC8:IPv4_HEADER_01-04

IPv4_HEADER_01: Ensure that the DUT generates an IPv4 Packet with a Total Length greater than or equal to 20 目的 确保DUT生成的IPv4报文的IP头部中的Total Length字段值大于等于20 IPv4协议头部中的Total Length字段表示整个IP数据包的长度,包括IP Header和payload之和,IP首部的长度最少就有20个字节,所以Total Length值肯定大于等于20

jasonj333 3961

各种锁的概述

当一个线程要获取一个被其他线程持有的独占锁时,该线程会被阻塞,那么当一个线程再次获取它自己已经获取的锁时是否会被阻塞呢?如果不被阻塞,那么我们说该锁是可重入的,也就是只要该线程获取了该锁,那么可以无限次数地进入被该锁锁住的代码。调用helloB方法前会先获取内置锁,然后打印输出。之后调用helloA方法,在调用前会先去获取内置锁,如果内置锁不是可重入的,那么调用线程将会一直被阻塞。实际上,synchronized内部锁是可重入锁。

andy的博客 943

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

C# 锁概述

特性用户模式锁内核模式锁混合模式锁是否进入内核否是条件性(先否后是)CPU 开销高(忙等待)低(线程休眠)自适应(低)延迟极低高低(短竞争时)跨进程支持❌✅❌典型代表SpinLockMutexSemaphorelock适用场景极短临界区、无锁结构跨进程、长时间等待通用高性能同步。

qq_44967213的博客 982

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

MySQL 锁概述

InnoDB 的表级锁比较鸡肋,一般不会被用到,重点在于理解 InnoDB 的行级锁。悲观锁:悲观锁是一种思想,顾名思义,就是很悲观,对数据被其他事务的修改持保守态度,会通过数据库自身的锁机制来实现,从而保证数据操作的排它性。悲观锁总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会锁,这样别人再去操作这个数据时就会被阻塞直到它拿到锁(比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁,当其他线程想要访问数据时,都需要阻塞挂起。

干就完了!!! 1045

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

无锁算法CAS 概述

无锁算法CAS 概述    JDK5.0以后的版本都引入了高级并发特性,大多数的特性在java.util.concurrent包中,是专门用于多线并发编程的,充分利用了现代多处理器和多核心系统的功能以编写大规模并发应用程序。主要包含原子量、并发集合、同步器、可重入锁,并对线程池的构造提供了强力的支持。   原子量是定义了支持对单一变量执行原子操作的类。所有类都有get和set方法,工作方法和对...

weixin_34050519的博客 132
上一篇: vb.net的String数据类型
下一篇: MSDTC服务出错
ly_wolf
博客等级 码龄16年 9粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值