Sql server SQL Server锁定的DataReader行为
当通过Sql server SQL Server锁定的DataReader行为,sql-server,locking,datareader,Sql Server,Locking,Datareader,当通过DataReader从SQL server查询返回大型数据集时,我们的数据层出现了一些问题。当我们使用DataReader来填充业务对象并将它们序列化回客户端时,获取可能需要几分钟(我们正在向用户显示进度:-),但我们发现,受影响的表上存在一些相当核心的锁定,这导致其他更新被阻止 因此,我想我有点天真的问题是,在什么情况下,由于执行查询而取出的锁实际上被放弃了?我们似乎发现锁一直存在,直到处理完DataReader的最后一行,并且DataReader实际关闭为止-这似乎正确吗?简单介绍一下
DataReader
从SQL server查询返回大型数据集时,我们的数据层出现了一些问题。当我们使用DataReader
来填充业务对象并将它们序列化回客户端时,获取可能需要几分钟(我们正在向用户显示进度:-),但我们发现,受影响的表上存在一些相当核心的锁定,这导致其他更新被阻止
因此,我想我有点天真的问题是,在什么情况下,由于执行查询而取出的锁实际上被放弃了?我们似乎发现锁一直存在,直到处理完DataReader
的最后一行,并且DataReader
实际关闭为止-这似乎正确吗?简单介绍一下DataReader
在幕后的工作原理会很好,因为我一直在努力寻找关于它的合适信息
我应该说,我意识到锁定问题是主要问题,但我只关心DataReader
的行为
- 此查询持有什么类型的锁?
- S、 U,X李>
- 行、页、表
- 射程锁
- 是否发生锁升级
- 为什么在查询期间保持锁?
- 是否使用可重复读取或序列化隔离级别?若有,原因为何
- 你使用锁提示吗?若有,原因为何
顺便说一句,我不建议改变客户端的行为。我假设现在您正在SqlDataReader.read循环中读取业务对象时将其封送回,这就是实现方法。预先读取内存,然后封送可能会在大型数据集上增加更多问题。选择临时表将缩短锁定时间
select blah from tbl into #temp << locks held and released
select * from #temp << take all the time you want now
select blah from tbl to#temp Point 1很有趣:我经常看到非常棒的答案,谢谢。查询是在读提交隔离级别下执行的,将读提交快照设置为ON确实解决了阻塞问题。我仍然很好奇,为什么锁(大多数是S页锁)在查询期间一直保持不变,因为没有使用锁提示,而且根据SQL Profiler,没有发生锁升级。