关于laravel链接sqlserver使用WITH(NOLOCK)优雅一点的解决办法
2023年6月13日15:19:16
NOLOCK使用场景
针对那些被频繁操作(插入、更新、删除)的表,使用NOLOCK是非常比较适合的,但要考虑到脏读的情况。
不经常修改的数据表,省掉锁定表的时间来大大加快查询速度。
数据量非常大的数据表,可以考虑牺牲数据安全性来提升查询的效率;
允许出现脏读现象的业务逻辑,对数据完整性要求比较严格的场景不适合,比如电商、银行等系统。
当使用NoLock时,它允许阅读那些已经修改但是还没有结束事务的数据。因此要考虑transaction事务数据的实时完整性时,不建议使用。
nolock和with(nolock)的区别,三种查询写法
SELECT * FROM A NOLOCK;SELECT * FROM A (NOLOCK);SELECT * FROM A WITH(NOLOCK);
1、SQLServer2005版本中,只支持with(nolock)关键字
2、with(nolock)的写法非常容易再指定索引
3、跨数据库服务器查询语句时不能用with (nolock) 只能用nolock,同数据服务器查询时 两者都可以用
SQL Server 2008版本之后建议采用WITH(NOLOCK)写法。
表解锁脚本
--查询被锁表select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName from sys.dm_tran_locks where resource_type='OBJECT';
--参数说明 spid 锁表进程 ;tableName 被锁表名-- 解锁语句 需要拿到spid然后杀掉缩表进程declare @spid int Set @spid = 57
--锁表进程declare @sql varchar(1000)set @sql='kill '+cast(@spid as varchar)exec(@sql)
laravel写法:
原生写法
$results = DB::select("SELECT * FROM my_table WITH (NOLOCK)");
orm写法,建议写法
DB::table('my_table')->lock('WITH(NOLOCK)')
生成语句
select * from my_table WITH(NOLOCK);
sharedLock 可能会有问题
$mz = DB::connection('sqlsrv')->table('VW')->sharedLock();
生成语句
select * from [VW] with(rowlock,holdlock)
QQ一群 247823727
QQ二群 166427999
如果项目有技术瓶颈问题,请联系↓↓
QQ: 903464207
微信: zx903464207
QQ二群 166427999
如果项目有技术瓶颈问题,请联系↓↓
QQ: 903464207
微信: zx903464207
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
2022-06-13 luajit开发文档中文版(三)FAQ 常见问题
2022-06-13 luajit开发文档中文版(二)LuaJIT扩展
2022-06-13 luajit开发文档中文版(一)下载和安装
2022-06-13 luajit开发文档wiki中文版(四) LuaJIT 内部结构
2022-06-13 luajit开发文档wiki中文版(五) 系统集成
2022-06-13 luajit开发文档wiki中文版(六) LuaJIT 开发
2022-06-13 luajit开发文档wiki中文版(三)性能调优和测试