关于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)

posted on 2023-06-13 15:29  zh7314  阅读(141)  评论(0编辑  收藏  举报