msdn上的描述的不太懂,麻烦大虾解释下

qq497525725 2010-12-20 10:15:29
B. 使用 TABLOCK 和 HOLDLOCK 优化器提示
下面的部分事务说明了如何在 Employee 上放置一个显式共享表锁,以及如何读取索引。该锁将在整个事务中被持有。


USE AdventureWorks2008R2 ;
GO
BEGIN TRAN
SELECT COUNT(*)
FROM HumanResources.Employee WITH (TABLOCK, HOLDLOCK) ;


我还是不知道 后面with 子句的意思,另外麻烦解释下为什么要跟这个with 有什么用。
...全文
92 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
billpu 2010-12-20
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 qq497525725 的回复:]

你这个例子要事务结束的话还需要commit tran提交,才可以释放 ?
这个的意思是:
如果没有写commit tran 或者ROLLBACK 这个表会一直锁着? 不能有其他操作么?
[/Quote]
可以读,但是不能update,这个是你的holdlock决定的
rucypli 2010-12-20
  • 打赏
  • 举报
回复
TABLOCK
指定表采用的共享锁一直保持到语句结束。如果同时指定了 HOLDLOCK,那么,在事务结束之前将一直保持该共享表锁。

如果与 OPENROWSET 大容量行集提供程序一起用于将数据导入无索引的表,则 TABLOCK 将启用多个客户端,同时将数据加载到包含优化日志记录和锁定的目标表中。
HOLDLOCK
等同于 SERIALIZABLE。有关详细信息,请参阅本主题后面的 SERIALIZABLE。HOLDLOCK 仅应用于那些为其指定了 HOLDLOCK 的表或视图,并且仅在使用了 HOLDLOCK 的语句定义的事务的持续时间内应用。HOLDLOCK 不能被用于包含 FOR BROWSE 选项的 SELECT 语句。
SERIALIZABLE
等同于 HOLDLOCK。保持共享锁直到事务完成,使共享锁更具有限制性;而不是无论事务是否完成,都在不再需要所需表或数据页时立即释放共享锁。执行扫描时所用的语义与在 SERIALIZABLE 隔离级别运行的事务的语义相同。有关隔离级别的详细信息,请参阅 SET TRANSACTION ISOLATION LEVEL (Transact-SQL)。


rucypli 2010-12-20
  • 打赏
  • 举报
回复
粒度提示:PAGLOCK、NOLOCK、ROWLOCK、TABLOCK 或 TABLOCKX。
隔离级别提示:HOLDLOCK、NOLOCK、READCOMMITTED、REPEATABLEREAD 和 SERIALIZABLE。
王向飞 2010-12-20
  • 打赏
  • 举报
回复
可以读,但不可以更新
qq497525725 2010-12-20
  • 打赏
  • 举报
回复
你这个例子要事务结束的话还需要commit tran提交,才可以释放 ?
这个的意思是:
如果没有写commit tran 或者ROLLBACK 这个表会一直锁着? 不能有其他操作么?
billpu 2010-12-20
  • 打赏
  • 举报
回复
显示指定锁的粒度为整个表,
holdlock就是锁将持续保持到事务结束
你这个例子要事务结束的话还需要commit tran提交,才可以释放
guguda2008 2010-12-20
  • 打赏
  • 举报
回复
WITH是表提示,加入后显式指定本条SELECT语句执行期间对该表加表锁,并将表锁持续到事务结束(也就是COMMIT和ROLLBACK)

22,206

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧