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

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下就遇到了问题.
...全文
70 3 打赏 收藏 举报
写回复
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
加入

3.3w+

社区成员

MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
申请成为版主
帖子事件
创建了帖子
2005-06-07 05:05
社区公告
暂无公告