我应该如何从被不断插入数据的表中提取数据,而不会引起任何锁定以使插入操作继续进行。
我查看了一些资料并发现了使用select with nolock选项,但是,如果我理解正确的话,这并不阻止锁的创建,而是绕过当前的锁,抓取所有内容?
谢谢。
编辑:这个表将永远不会被更新,只会进行插入和选择操作。
我应该如何从被不断插入数据的表中提取数据,而不会引起任何锁定以使插入操作继续进行。
我查看了一些资料并发现了使用select with nolock选项,但是,如果我理解正确的话,这并不阻止锁的创建,而是绕过当前的锁,抓取所有内容?
谢谢。
编辑:这个表将永远不会被更新,只会进行插入和选择操作。
在从表中选择时,您可以使用NOLOCK提示。这样做会产生一些副作用(您基本上可以获得一个脏读取)。
NOLOCK在您添加它的查询中不会发出行锁,并且不会影响其他正在运行的查询发出的锁。NOLOCK确实会发出一个Sch-S锁,即模式稳定性锁,这不会给您带来问题。
我相信你有误解。使用 (nolock) 的 select 语句将不会获取任何锁。也就是说,它不会阻止其他写操作。
缺点似乎在于它将包括未提交的读取,因此结果可能在写入事务回滚时不可靠。
你可以使用NOLOCK,但我只会建议在那些你知道“脏数据”是可以接受的情况下使用(例如,一个syslog数据库,你知道一旦插入数据就不会被更改或删除)。最好的方法是从未被锁定的数据中进行SELECT;你能够识别哪些行没有受到你的插入影响吗?例如,如果你的数据是通过CreateDate列默认为GETDATE()来插入的,请确保你的查询从该点之前获取数据。
当然,这都取决于正在写入多少数据以及插入语句是否生成行、页或表锁定...
NOLOCK
或NO COMMIT
级别时可以工作(尽管您可能会获得脏读取),但您应该能够安全地使用READ COMMITTED
(或等效级别)。因为您没有进行更新,所以不应该出现锁争用问题(它将跳过所有已插入但尚未提交的内容)。 - Clockwork-Muse