我有个sqlserver 表 dbo.Money (ID(主键自增),MemberID,Money,Balance)
频繁对该表使用如下sqlserver语句插入流水数据
Insert into dbo.Money(MemberID,Money,Balance)
SELECT @MemberID,@Money,IsNull((Select Top 1 Balance From dbo.Money with(nolock) Where MemberID=@MemberID ORDER BY ID DESC),0)+@Money
WHERE (IsNull((Select Top 1 Balance From dbo.Money Where MemberID=@MemberID ORDER BY ID DESC),0)+@Money)>=0
出现了数据错误 当@money为负数时 多次插入后出现了Balance为负数的情况
我猜测是并发导致了问题 但不清楚是哪种情况 如果我对select Top 1 Balance加上更新锁能解决问题么? 是否合理呢?
根据情况描述,这属于不可重复读的情况。不可重复读是指在一个事务中,多次读取同一数据,但是获取到的结果却不一致。
加上更新锁可以一定程度上解决问题,更新锁可以在读取数据时阻止其他事务对该数据进行修改,保证数据的一致性。但是需要注意的是,更新锁会导致其他事务的阻塞,可能会影响系统的性能。
在实际应用中,需要根据具体的业务场景和数据情况来选择合适的解决方案。建议对该表进行优化,例如添加索引、更改事务隔离级别等,以避免出现不可重复读和幻读等问题。