sqlserver使用 cte 时会将涉及表都锁住吗?求高手解答,本人不懂其中原理望详解
追问:这个共享锁可以避免吗?这样的查询结束之后,被锁的资源能够及时释放吗?我看有的高手提到了nolock,这个有必要加吗?要加在那里呢?
求大神指点
追问:这个共享锁可以避免吗?这样的查询结束之后,被锁的资源能够及时释放吗?我看有的高手提到了nolock,这个有必要加吗?要加在那里呢?
求大神指点
答案:with LayerTree
as
(
select id,LayerID,ParentLayerID from tbl_layer(nolock) where layerid='0101'
union all
select l.id,l.LayerID,l.ParentLayerID from tbl_layer l(nolock) join layertree lt(nolock)
on l.ParentLayerID = lt.LayerID
)
select * from LayerTree
select 只会添加共享锁,会阻塞其他insert跟update操作,不会阻塞select操作
其他:a CTE 与派生表类似,具体表现在不存储为对象,并且只在查询期间有效。定义 CTE 后,可以在 SELECT、INSERT、UPDATE 或 DELETE 语句中对其进行引用,就像引用表或视图一样。在视图中时无法修改的 也许就是你说的锁住 希望对你的问题有帮助
上一个:麻烦高手帮忙把一个sqlserver的触发器改成oracle的,谢谢了。。。sql脚本如下:
下一个:sqlserver存储过程语法错误的问题