• 主页
  • 基础类
  • 应用实例
  • 新技术前沿

邹健大哥请进,问一个关于锁的问题

mahongxi 2005-06-07 05:05:29
SQLSERVER2000, 客户端启动时BEGIN TRANS, 中间执行一个INSERT 语句到TAB1中,但不提交,此时到数据库查询分析器中执行SELECT * FROM TAB1,发现被锁住(实际中是其它客户端登录时遇到读表时死锁).
估计是SQLSERVER采用了表级锁定.
查了一些资源, INSERT写法改为INSERT INTO TABLE WITH(ROWLOCK) 也是不行.
请问却省情况下,SQLSERVER 在数据更改时锁定整个表吗? 如何统一改变这种机制为行级锁定(我可不想在每个SQL上作文章, 因为实在是太多了)

btw,这些代码在ORACLE下都是正常工作的,但到了SQLSERVER下就遇到了问题.
...全文
44 点赞 收藏 3
写回复
3 条回复
heguosheng 2005年06月09日
mark
回复 点赞
duanduan1122 2005年06月09日
locks 选项
使用 locks 选项设置可用锁的最大数量,以限制 Microsoft® SQL Server™ 用于锁的内存量。默认设置为 0,即允许 SQL Server 根据系统需要动态分配和收回锁。

当服务器以 locks 的设置为 0 启动,锁管理器分配 SQL Server 可用内存的 %2 给锁结构初始池当锁池耗尽时,系统会分配另外的锁,动态锁池的内存分配不能多于 SQL Server分配到的内存的 %40。

通常情况下,如果锁需要的内存比当前可用的内存少,而更多的服务器内存是可用的(max server memory 上限还没有达到),则 SQL Server 动态分配内存满足锁的需求。然而,如果内存分配导致操作系统级的换页(例如,如果另一个应用程序与 SQL Server 实例运行于同一台计算机上并使用该计算机上的内存),则将分配更多的锁空间。

建议让 SQL Server 动态使用锁。然而,可以设置 locks 从而覆盖 SQL Server 动态分配锁资源的能力。如果SQL Server显示已经没有可用的锁的消息,请增大该选项的值。由于每一个锁都需要消耗内存(每一个锁需 96 字节),增加该值将增加整个服务器对内存的需要。

locks 是一个高级选项。如果要用 sp_configure 系统存储过程改变该设置,必须把 show advanced options 设置为1,该选项在停止并重新启动服务器后生效。
回复 点赞
duanduan1122 2005年06月09日
请问却省情况下,SQLSERVER 在数据更改时锁定整个表吗?
答:
1。当然不是了。sql server默认的时候是自己颁发锁的
2。可以加锁的资源有1。行锁 2。键锁 3。页锁 4。盘区锁 5。表锁 6。库锁
3。如果更新一行,sql server只颁发行锁
4。如果更新整张表的时候,才颁发表锁的
5。同时,sql server中会有锁的升级的
回复 点赞
发动态
发帖子
MS-SQL Server
创建于2007-09-28

1.4w+

社区成员

25.3w+

社区内容

MS-SQL Server相关内容讨论专区
社区公告
暂无公告