SQL Server表值函数锁机制疑问:主查询与函数锁是否独立?
关于表值函数锁机制的疑问
函数代码
ALTER FUNCTION dbo.fn_Test () RETURNS @t TABLE ( ID INT ) AS BEGIN INSERT INTO @t(ID) select ID from dbo.Table; RETURN END GO
问题
若在关联其他表的SELECT语句中使用该函数,主查询会对dbo.Table获取共享读锁吗?还是函数会独立于主查询获取锁以填充表变量?
回答
- 你写的是多语句表值函数(MSUDF),它在被主查询调用时,锁的获取完全处于主查询的事务上下文内,不会独立获取锁。
- 当主查询执行时,函数内部对
dbo.Table的SELECT操作会和主查询的其他操作共用同一个事务,因此会获取共享读锁,锁的生命周期和主查询的事务保持一致,不会因为表变量填充完成就提前释放。 - 简言之,函数的锁行为是主查询执行流程的一部分,不存在独立的锁上下文。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

