spring 事务 sqlserver 锁表问题

方案一:单独方式,不进行交易。
时间:5 分钟,位置:代码库,数量:一行代码。
方案2 :降低事务级别,避免表死锁。
时间:1 0分钟,地点:数据库配置,数量:行关闭效率高。
不用打磨就可以了。

SQLSERVER 的 nolock 到底是怎样的无锁

嗯,昨天当我对旧系统进行故障排除时,我发现选定的搜索一直卡住。
查看后台原来是另一个事务正在更新同一个表的数据,锁被占用了。
当时我想,如果我能忽略锁就好了。
所以nolock这个特性还是蛮有趣的。

我记得去年六月我在测试环境中进行了实验。
一个名为orders的表存储了1 5 00条订单数据。
它在创建时没有被故意索引。
首先在会话A中执行update order set status='completed' where order_id=1 00。
此操作需要1 0秒才能完成。
我盯着SQL Profiler,发现它一直在请求X锁。
然后我在会话B中执行select from order where order_id=1 00,结果没有数据,卡在那里等待锁。

这时我才明白为什么需要nolock。
如果没有锁,查询将会排队等待锁被释放。
但使用nolock时,查询会直接读取未提交的数据。
虽然数据可能有点旧,但至少没有卡住。
就像你领取火车票时,一般要排队半小时,但黄牛票即使再贵,也会直接带你上火车。
然而,黄牛可能会把你带到错误的地方。
这就是脏读的问题。

最好笑的是,有一次我在开发环境测试的时候,添加了nolock来检查刚刚完成截表操作的表,结果还是被阻塞了。
当时我就疑惑了,截断不是锁了全表吗?查了资料后发现是Sch-S锁。
nolock不会在页面级别加锁,但它仍然是表单级别的锁。
就好像你的门没锁,但社区看门人仍然会阻止你。

所以现在使用nolock要看情况。
例如,临时报告用于检查旧数据,或者当您知道数据肯定不会改变时。
但关键业务必须谨慎使用。
我记得上次为客户调整系统时,我对所有搜索都添加了nolock。
结果,客户抱怨数据不符。
我看了一下,发现有人半夜在后台运行数据同步,而我的nolock直接读取未同步的数据。
客户以为系统出问题了,哈哈。

等等,我突然想到,nolock会影响统计信息的收集吗?上次给旧系统添加索引,是因为统计信息太旧了。
结果,该索引根本没有用处。
将不得不再试一次。

如何掌握SQLServer的锁机制

你好,SQL Server的锁定机制确实很复杂。
我记得2 02 2 年在一个城市做一个项目。
当时我还在做数据库工作。
那是我第一次听说 NOLOCK 的时候。
当时我很困惑,不知道这意味着什么。
后来项目快完成的时候,我花了一些时间调查,发现NOLOCK没有加锁。
这意味着它不会在读取数据时将您锁定。
当时,我认为这只是轻松阅读。
结果,我后来意识到这可能是读取脏数据,即来自未提交或回滚事务的数据。

我们来谈谈HOLDLOCK。
这意味着保持锁定并且在整个事务结束之前不释放它。
当时,我编写了一个名为“SELECTFROMmy_tableHOLDLOCK”的查询来保持锁定,直到查询完成。
这保证了数据的一致性,但代价是效率降低。

还有UPDLOCK,它在读取数据时使用修改锁而不是共享锁,并保持直到事务结束。
当时,这是用来确保数据被读取时,不会被其他事务修改,并且可以被其他进程读取。

TABLOCK 在整个表上放置共享锁,直到命令结束。
我当时用这个来保证其他进程只能读取而不能修改。

PAGLOCK,默认选项,使用共享页面锁定。
我当时并没有太注意这一点。
可能是因为它是默认使用的。

最后,TABLOCKX 在整个表上放置排它锁,直到命令或事务结束。
我记得这个功能很少使用,但我知道这样做可以防止其他进程读取或修改表中的数据。

最终,这种锁定机制是为了让数据库操作更加安全和一致,但实际上使用起来相当麻烦。

sqlserver select语句的状态是suspend

此 SQL Server 的 SELECT 语句显示“暂停”,这意味着它被卡住了。
你知道,你还在等什么?
最常见的是堵塞。
想想看,如果你没有在 SELECT 中添加 NOLOCK,它默认为 READCOMMITTED。
还有谁在更改数据?例如,如果另一个事务正在删除、修改或添加数据,则它必须添加 X 或 U 键。
你的 SELECT 想要读取并且你想添加一个 S 键,但是该键不见了,所以它卡住并显示“挂起”。
就是这么简单。
例如,2 02 2 年,我遇到一个更新订单表的事务,然后另一个查询想要查看订单详细信息,但由于锁不安全而卡住了很长时间。

此外,它是 I/O。
如果你的查询扫描大量数据,比如扫描全表或者扫描特别大的索引,然后你的硬盘跟不上,响应慢,那么就必须从硬盘读取数据。
如果读取速度慢,SELECT 将等待并显示“暂停”。
2 02 2 年我在一家公司工作,控制着一张几百G的表。
我直接扫描了整个表,没有添加索引。
CPU 没有冻结,硬盘也立即开始旋转。
那个SELECT,哦,让我很头疼。

然后是记忆。
当内存不够时,SQL Server可能会将一些页面转储到硬盘。
您的 SELECT 想要读取数据,但发现该页内存不足。
又要等了,又“暂停”了。
或者 ResourceGovernor,它限制您的资源。
您的请求无法使用该资源,已被阻止。

应该做什么?你看,如果是锁定问题,可以使用NOLOCK,但那样很危险,而且会读取到脏数据。
或者你也可以把事情缩短,这样就不会一直陷入困境。
如果I/O较慢,请添加索引以减少扫描。
如果内存不够,请添加更多内存。
此外,您还可以使用这些 DMV(例如 sys.dm_exec_requests)来查看正在等待的内容。

“挂起”,有时是正常的,但如果挂起时间较长,系统就会变慢。
你需要清楚地找出原因是什么,然后再想解决办法。
好吧,就是这样。