在事务中查询一个条数据,然后根据这条数据的结果再更新其他几条数据。在整个事务过程中,查询、更新的这几条数据是不是一直都被锁住。其他人访问?

解决方案 »

  1.   

    select 的那条锁不住
    update在更新的时候会锁住一下下
      

  2.   

    如果select的锁不住,如果我要更新一个值+500,在查询、更新的这段过程中这个值被修改了怎么办?
      

  3.   

    begin tran
        declare @value int
        select @value=字段值 from tbname with(xlock,paglock) where id=9
        update ....
    commit tran
      

  4.   


    这样select时查询的字段就会被锁住?更新后在解锁?如果不过通过SQL的事务而是程序中的事务是否也一样?
      

  5.   


    如果这个值正在被修改 上面一定有排他锁 这样你更新(+500)的操作肯定是waiting状态
    如果这个值已经修改完毕 锁被收回 更新操作顺利进行
      

  6.   


    xlock设定排他级别 pagelock设定上锁范围 即id=9所在page上有完全排他锁 
      

  7.   


    select @value=字段值 from tbname with(xlock,paglock) where id=9 对于只查询一条数据的为什么不使用ROWLOCK,而是paglock?ROWLOCK不是更合适?paglock会锁定多少条数据?只锁定where id=9 的数据?sql的锁一直都没用过,也没看过这方面资料,麻烦解释一下。
      

  8.   

    那就先看看书,:)锁定和行版本控制
    http://msdn.microsoft.com/zh-cn/library/ms187101.aspx
      

  9.   


    关于锁的理论我还是知道的。关键是对with(xlock,paglock)的意思不太明白,为什么不用ROWLOCK?相对于页,行应该锁住的范围更小,更加合适。
      

  10.   

    是否锁住看事务的隔离级别以及采用什么锁select * from 表 with (nolock) 时,别人更新也锁不住你
      

  11.   


    现在问的是with(xlock,paglock)的问题,请注意看回帖
      

  12.   


    sql server如果要控制rowlock,将会付出很大的代价,而且一个page页里的多个数据行在交叉操作时采用rowlock,容易产生死锁.
    我觉得这个sql server一个不够强大的地方,他不能像oracle似的采用精度很细的行级锁。
      

  13.   


    如果要在是事务中禁止其他连接访问的数据用with(xlock,paglock)比with(xlock,rowlock)更合适?其他的有没有更好的办法?
      

  14.   

    select 时只能用with(xlock,paglock) 或with (xlock,tablock)
    用with (xlock,rowlock)时不起作用,得到的不是排它锁,只是REPEATABLEREAD锁