qq_26025975 2020-04-01 15:41 采纳率: 0%
浏览 116

这种情况是属于不可重复读还是幻读啊? 加上更新锁能解决问题么?

我有个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加上更新锁能解决问题么? 是否合理呢?

  • 写回答

1条回答 默认 最新

  • 憧憬blog 2023-03-15 01:57
    关注

    根据情况描述,这属于不可重复读的情况。不可重复读是指在一个事务中,多次读取同一数据,但是获取到的结果却不一致。

    加上更新锁可以一定程度上解决问题,更新锁可以在读取数据时阻止其他事务对该数据进行修改,保证数据的一致性。但是需要注意的是,更新锁会导致其他事务的阻塞,可能会影响系统的性能。

    在实际应用中,需要根据具体的业务场景和数据情况来选择合适的解决方案。建议对该表进行优化,例如添加索引、更改事务隔离级别等,以避免出现不可重复读和幻读等问题。

    评论

报告相同问题?

悬赏问题

  • ¥15 python的qt5界面
  • ¥15 无线电能传输系统MATLAB仿真问题
  • ¥50 如何用脚本实现输入法的热键设置
  • ¥20 我想使用一些网络协议或者部分协议也行,主要想实现类似于traceroute的一定步长内的路由拓扑功能
  • ¥30 深度学习,前后端连接
  • ¥15 孟德尔随机化结果不一致
  • ¥15 apm2.8飞控罗盘bad health,加速度计校准失败
  • ¥15 求解O-S方程的特征值问题给出边界层布拉休斯平行流的中性曲线
  • ¥15 谁有desed数据集呀
  • ¥20 手写数字识别运行c仿真时,程序报错错误代码sim211-100