首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 一个非常急的问题?关于SQL多用户!!! [无满意答案结贴,结贴人:jsjkhanwei]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-15 20:41:06 楼主
    我有一个表,是记录单据的最大号的,由于使用人有几十个,有时被锁死了,是整全表被锁死了,其他人都打不开了。导致系统出现问题???
    请高手指教,如何才现对表中某一行记录进行锁定,以便其他的记录可以被读取!!!
    ID    BH      NOWID
    1    1001    2345
    2      1002    997
    3      1003    876


    98  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-15 20:42:371楼 得分:0
    用行锁
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-15 20:43:132楼 得分:0
    这个等老乌龟来贴吧!
    呵呵 :)
    貌似有行锁,不要用表锁就行了.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-15 20:44:593楼 得分:0
    翻到以前老大的老古董,看看吧!

    关于行锁的问题,紧急对应,解决给分
    http://topic.csdn.net/t/20050317/15/3859017.html
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-15 20:45:364楼 得分:0
    几十人用一张表,就把表锁死了???

    你的程序有问题吧!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-15 20:48:285楼 得分:0
    begin tran

    update T with(ROWLOCK)set number=number+1 where ID=1
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-15 20:49:106楼 得分:0
    加上行锁不会影响其它记录的更新
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-15 21:04:577楼 得分:0
    但我的条件是?
    select * from gb_Maxm where Code='120' and Kj=2008 and ckcode=''

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-15 21:07:248楼 得分:0
    请问题如果没有加:with(ROWLOCK)行锁,在多用下会出现什么问题???
    update bb with(ROWLOCK) set dd=0990 where id=1098

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-15 21:10:349楼 得分:0
    SQL code
    SELECT au_lname FROM authors WITH (NOLOCK) 锁定提示 描述 HOLDLOCK 将共享锁保留到事务完成,而不是在相应的表、行或数据页不再需要时就立即释放锁。HOLDLOCK 等同于 SERIALIZABLE。 NOLOCK 不要发出共享锁,并且不要提供排它锁。当此选项生效时,可能会读取未提交的事务或一组在读取中间回滚的页面。有可能发生脏读。仅应用于 SELECT 语句。 PAGLOCK 在通常使用单个表锁的地方采用页锁。 READCOMMITTED 用与运行在提交读隔离级别的事务相同的锁语义执行扫描。默认情况下,SQL Server 2000 在此隔离级别上操作。 READPAST 跳过锁定行。此选项导致事务跳过由其它事务锁定的行(这些行平常会显示在结果集内),而不是阻塞该事务,使其等待其它事务释放在这些行上的锁。READPAST 锁提示仅适用于运行在提交读隔离级别的事务,并且只在行级锁之后读取。仅适用于 SELECT 语句。 READUNCOMMITTED 等同于 NOLOCK。 REPEATABLEREAD 用与运行在可重复读隔离级别的事务相同的锁语义执行扫描。 ROWLOCK 使用行级锁,而不使用粒度更粗的页级锁和表级锁。 SERIALIZABLE 用与运行在可串行读隔离级别的事务相同的锁语义执行扫描。等同于 HOLDLOCK。 TABLOCK 使用表锁代替粒度更细的行级锁或页级锁。在语句结束前,SQL Server 一直持有该锁。但是,如果同时指定 HOLDLOCK,那么在事务结束之前,锁将被一直持有。 TABLOCKX 使用表的排它锁。该锁可以防止其它事务读取或更新表,并在语句或事务结束前一直持有。 UPDLOCK 读取表时使用更新锁,而不使用共享锁,并将锁一直保留到语句或事务的结束。UPDLOCK 的优点是允许您读取数据(不阻塞其它事务)并在以后更新数据,同时确保自从上次读取数据后数据没有被更改。 XLOCK


    select * from ta WITH (UPDLOCK,READPAST)
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-15 21:36:2410楼 得分:0
    我在整个项目中没有使用任何锁?为何也会出被一张表锁死了,无论如何也打不开?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-15 21:38:1111楼 得分:0
    这和事务的管理  ,索引,主键及你的查询条件  有关
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-15 21:38:5812楼 得分:0
    如何能看出来,我的表是被那一条SQL语句,锁死了?我用的是2005??
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-15 21:42:2513楼 得分:0
    关于“事务的管理  ,索引,主键及你的查询条件“
    能详细讲解一下吗?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-15 21:54:2514楼 得分:0
    SQL code
    --查看锁信息 create table #t(req_spid int,obj_name sysname) declare @s nvarchar(4000) ,@rid int,@dbname sysname,@id int,@objname sysname declare tb cursor for select distinct req_spid,dbname=db_name(rsc_dbid),rsc_objid from master..syslockinfo where rsc_type in(4,5) open tb fetch next from tb into @rid,@dbname,@id while @@fetch_status=0 begin set @s='select @objname=name from ['+@dbname+']..sysobjects where id=@id' exec sp_executesql @s,N'@objname sysname out,@id int',@objname out,@id insert into #t values(@rid,@objname) fetch next from tb into @rid,@dbname,@id end close tb deallocate tb select 进程id=a.req_spid ,数据库=db_name(rsc_dbid) ,类型=case rsc_type when 1 then 'NULL 资源(未使用)' when 2 then '数据库' when 3 then '文件' when 4 then '索引' when 5 then '' when 6 then '' when 7 then '' when 8 then '扩展盘区' when 9 then 'RID(行 ID)' when 10 then '应用程序' end ,对象id=rsc_objid ,对象名=b.obj_name ,rsc_indid from master..syslockinfo a left join #t b on a.req_spid=b.req_spid go drop table #t
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-15 22:00:5715楼 得分:0
    大体上说说

    1 使用事务时,处理尽量简单时间尽量短,保证非人为干预因素;
    2 设置死锁超时参数为合理范围,如:3分钟-10分种;超过时间,自动放弃本次操作,避免进程悬挂;

    下例将锁超时期限设置为 1,800 毫秒。
    SET LOCK_TIMEOUT 1800

    3 优化程序,检查并避免死锁现象出现;
    4 一般不要修改SQL SERVER事务的默认级别。不推荐强行加锁
    5 设置事务隔离级别。
    6 配置索引的锁定粒度
        可以使用 sp_indexoption 系统存储过程来设置用于索引的锁定粒度
    7 可以使用SET DEADLOCK_PRIORITY控制在发生死锁情况时会话的反应方式
    8 查询分析器  CLTR  +  2  看看哪个锁
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-15 22:02:1216楼 得分:0
    9、索引的顺序问题,上面有钻钻的链接,自己看
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-15 22:04:0417楼 得分:0
    SET DEADLOCK_PRIORITY
    控制在发生死锁情况时会话的反应方式。如果两个进程都锁定数据,并且直到其它进程释放自己的锁时,每个进程才能释放自己的锁,即发生死锁情况。

    语法
    SET DEADLOCK_PRIORITY { LOW ¦ NORMAL ¦ @deadlock_var }

    参数
    LOW

    指定当前会话为首选死锁牺牲品。Microsoft® SQL Server™ 自动回滚死锁牺牲品的事务,并给客户端应用程序返回 1205 号死锁错误信息。

    NORMAL

    指定会话返回到默认的死锁处理方法。

    @deadlock_var

    是指定死锁处理方法的字符变量。如果指定 LOW,则 @deadlock_var 为 3;如果指定 NORMAL,则 @deadlock_var 为 6。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-15 22:14:4718楼 得分:0
    记录最大号的,就是插入表时update此表.
    减少冲突可按以下方法来避免.
    1.因为是一条记录对应一个表,查询时就加上where
      那个表对应那条记录就where那条记录.
    2.事务执行要快速,在插入操作时再启动事务.
      对客户端的添加记录,可先录入数据,最大号码在保存操作时再自动生成加上.
      如果确实要在录入时显示最大号,可查询最大号显示(注意在录数据时不要启动事务)
      到数据录入完成,保存记录时,启动事务,再重新查询获得最大号,插入保存数据,结束事务.
      如新的最大号与原不同,再指示.
    3.几十个人不应该会死锁.
      估计是在客户端录数据时,事务一直启动而导致死锁.

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-15 22:38:4219楼 得分:0
    其实客户连接数量很小的.我的数据库几百个人都快速的录入都没有事的.肯定出现了客户端设计问题.如楼上所述的第三种情况.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-15 23:16:4620楼 得分:0
    我经常遇到此问题,就是我的SQL的内存不断增大,如何让其降下来。有没什么好的方法。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-15 23:20:5621楼 得分:0
    --设置 min server memory 配置项
    EXEC sp_configure N'min server memory (MB)', 0

    --设置 max server memory 配置项
    EXEC sp_configure N'max server memory (MB)', 256

    --使更新生效
    RECONFIGURE WITH OVERRIDE
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-15 23:23:5922楼 得分:0
    我的服务器是WIN2003+SQL2005,内存一般在1G左右,一但很多人,会上升到2G左右。这样会很烦。我如果设置了限制,SQL2005的性能会不会下降
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-16 09:52:5523楼 得分:0
    数据库的瓶颈一般不在你的内存上面. 你就是加大到再的情况有时候没有用的.你要使用性能分析器去查看一下瓶颈在哪里. 有时候往往在硬盘上.
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved