sql server想问问 with nolock的使用

心在飞扬 2021-02-16 06:15:37
基本业务是这样... 我现在在做一个系统,有时候会有抢票,并发量比较大,所以一般这个时候,系统后面就发生大量的死锁....


我的表大概简单来说 就 五个,可以简单说为 A,B,C,D,E,然后一些查询的存储过程①,②,③,然后还要主要提交的存储过程(1)

在并发量大的时候,各个都访问了存储过程(1),所以会导致这个存储引起死锁。

但是我现在优化的是①,②,③这些查询的存储,我在这些存储上面,所有查询A,B,C,D,E表的select下,都是用了 with nolock....

我现在想做的就是,展示给客户看的时候,不要发生阻塞,这些表都是允许有脏数据的,所以可以用with nolock....

只要提交的存储过程(1)里面不用with nolock 就能保证数据准确了。。


但是我现在发生的问题是,即便①,②,③使用了with nolock,但是当用户调用这些存储时,依然会报 访问超时...或者
事务(进程 ID %1!)与另一个进程已被死锁在资源 {%2!} 上,且该事务已被选作死锁牺牲品 类似的错误

这个我有点想不明白,因为我这些查询是没有用事务的,而且也开启了with nolock,所以我觉得①,②,③这些查询存储执行时
不会发生这种错误才对,如果是提交的存储(1)报错,我是能理解的,但是不能理解①,②,③执行时也报错。
...全文
168 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoxiangqing 2021-02-23
  • 打赏
  • 举报
回复
最好的方式是用redis来实现
唐诗三百首 2021-02-23
  • 打赏
  • 举报
回复
启用1222跟踪标记, 会把死锁的详细信息记录到SQL日志, 才能进一步分析.
心在飞扬 2021-02-22
  • 打赏
  • 举报
回复
引用 1 楼 薛定谔的DBA 的回复:
NOLOCK提示需要获得Sch-S锁,因此如果表被更改且未提交,使用NOLOCK的SELECT仍可能被阻止。
我数据库验证了一下,发现是可以自行的,因为我不存在表结构被更改的情况,只有表数据被改的情况。在表数据被改的情况下,是可以执行的
吉普赛的歌 2021-02-18
  • 打赏
  • 举报
回复
死锁,首先你应该弄清楚一件事情:
谁和谁死锁?
这个都没弄清,随便问没有任何意义。

你先按这个来,把以后查到的死锁具体语句贴出来, 让大家看看, 才好对症下药。
https://blog.csdn.net/yenange/article/details/73883915
薛定谔的DBA 2021-02-17
  • 打赏
  • 举报
回复
NOLOCK提示需要获得Sch-S锁,因此如果表被更改且未提交,使用NOLOCK的SELECT仍可能被阻止。





22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧