|zyciis| 第三贴,在事务中,如何锁死一个表中的一条记录,不被其他事务更新和读取呢,不要锁表 谢谢
http://topic.csdn.net/u/20090102/23/2a2ffb74-2bc1-4d59-ad2f-ca38a5bd85da.html?1080139824那在SQL2005中没有没更好的锁
谢谢或者这种情况的话大家是怎么做的谢谢 分表分析谢谢

解决方案 »

  1.   

    参考这个:锁定记录,只允许单用户修改的例子create table #锁表(编号 int)--代码:
    if exists(select 1 from 编号='你的编号') 
      returninsert #锁表 values('你的编号').....你处理的代码delete #锁表 where 编号='你的编号'
    --------------------------------------
    --为了防止死锁,建议加时间:create table #锁表(编号 int,时间 datetime)--代码:
    if exists(select 1 from 编号='你的编号' and datediff(ss,时间,getdate())<5  --如果锁的时候超过5秒,则是处理超时

      returndelete from #锁表
    insert #锁表 values('你的编号',getdate()).....你处理的代码delete #锁表 where 编号='你的编号'
    ---------------------------------------
    --锁定记录,只允许单用户修改的例子:--创建测试环境
    --创建测试表--部门表
    create table 部门(departmentid int,name varchar(10))--记录锁定表
    create table lock(departmentid int,dt datetime)go
    --因为函数中不可以用getdate,所以用个视图,得到当前时间
    create view v_getdate as select dt=getdate()
    go
    --创建自定义函数,判断记录是否锁定
    create function f_chk(@departmentid int)
    returns bit
    as
    begin
    declare @re bit,@dt datetime
    select @dt=dt from v_getdate
    if exists(select 1 from lock where departmentid=@departmentid
    and datediff(ss,dt,@dt)<5)
    set @re=1
    else
    set @re=0
    return(@re)
    end
    go--数据处理测试
    if dbo.f_chk(3)=1
    print '记录被锁定'
    else
    begin
    begin tran
    insert into lock values(3,getdate())
    update 部门 set name='A' where departmentid=3
    delete from lock where departmentid=3
    commit tran
    end--删除测试环境
    drop table 部门
    drop view v_getdate
    drop function f_chk
      

  2.   

    RE:dawugui
    ----------------------
    谢谢 你这里就是上面说的添加表的方法我这一贴问在SQL2005中有没有新的方法来解决这个问题谢谢
      

  3.   

    7.0前最小的就是分页了,其实从7.0开始已经完全实现了行锁,只是出于内存、资源管理的效率、密切操作等系统优化的结果就是页或表锁有更大优势来减少锁数和管理锁结构数量。(据说百W的行记录,如果每行一锁那要超过64M的ram来持有这些锁)如果我们手工控制锁的单位,并控制锁升级(SQL会适当时将行、键或页锁升级更粗的表锁)应该能达到要求参相关知识:键锁,行级锁定,锁升级
      

  4.   

    <table_hint> ::= [ NOEXPAND ] { 
        INDEX ( index_val [ ,...n ] )
      | FASTFIRSTROW 
      | HOLDLOCK 
      | NOLOCK 
      | NOWAIT
      | PAGLOCK 
      | READCOMMITTED 
      | READCOMMITTEDLOCK 
      | READPAST 
      | READUNCOMMITTED 
      | REPEATABLEREAD 
      | ROWLOCK 
      | SERIALIZABLE 
      | TABLOCK 
      | TABLOCKX 
      | UPDLOCK 
      | XLOCK 

      

  5.   

    数据量大且并发用户多的话,是一件不可想像的事Sql2005不晓得有没有,Oracle倒是有显式行级锁的