加锁的位置不对 应该加在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的行锁是不一定真的加行锁的,会根据实际情况升级,一般情况都是加的页锁。
建议: 使用rowlock的时候,建议结合holdlock一起使用。当然你可以提高事务隔离级别, e.g.在存储过程开始位置声明: SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
xlock,rowlock也不一定能锁足行 一般采用的方法是xlock,paglock来锁行。
锁应该加在取值的哪一行 SELECT @UserId=UserId,@status=status FROM Deposits WHERE DepositId=@billno;
这条语句下面有
insert 和 update操作
这个不是关键的,关键问题是,我锁定了,正常来说,第二条同样的DepositId 进来,事务是无法进行下去的
但现在,日志写了两条一样的,而且上样的操作,全部是操作了二次
就是说两个一样的请求,都进入了事务处理
应该加在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的行锁是不一定真的加行锁的,会根据实际情况升级,一般情况都是加的页锁。
使用rowlock的时候,建议结合holdlock一起使用。当然你可以提高事务隔离级别,
e.g.在存储过程开始位置声明:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
一般采用的方法是xlock,paglock来锁行。