本帖最后由 hellfirehe 于 2012-08-19 03:50:37 编辑

解决方案 »

  1.   

    有个疑问,你只是对update进行行锁定,又不是insert,为什么会有重复数据呢?
      

  2.   


    这条语句下面有
    insert 和 update操作
    这个不是关键的,关键问题是,我锁定了,正常来说,第二条同样的DepositId 进来,事务是无法进行下去的
    但现在,日志写了两条一样的,而且上样的操作,全部是操作了二次
    就是说两个一样的请求,都进入了事务处理
      

  3.   

    你给insert 也加上rowlock试试
      

  4.   

    加锁的位置不对
    应该加在select 语句SELECT @UserId=UserId,@status=status  FROM Deposits  WHERE DepositId=@billno;
    --》
    SELECT @UserId=UserId,@status=status  FROM Deposits with (xlock,rowlock) WHERE DepositId=@billno;另外,可能对行锁的理解有问题,sql server的行锁是不一定真的加行锁的,会根据实际情况升级,一般情况都是加的页锁。
      

  5.   

    建议:
    使用rowlock的时候,建议结合holdlock一起使用。当然你可以提高事务隔离级别,
    e.g.在存储过程开始位置声明:
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
      

  6.   

    xlock,rowlock也不一定能锁足行
    一般采用的方法是xlock,paglock来锁行。
      

  7.   

    锁应该加在取值的哪一行   SELECT @UserId=UserId,@status=status  FROM Deposits  WHERE DepositId=@billno;