下面的数据库操作应该是有并发安全问题的吧?

如果是Spring + mybatis + mysql 这种架构,请求处理时加上注解@Transactional,然后执行以下操作:
读取用户金币走select语句,去查询出的值扣除一个值,然后将结果写入数据库,走update语句,应该是有并发问题的吧?

阅读 2.5k
3 个回答

有,需要 select for update 锁一下

单纯的用事务去操作curd肯定是可能会出现并发问题的。

新手上路,请多包涵

有,spring事务不能保证并发的安全性。在多线程下会有脏读,幻读等问题。比如此时有两个线程a,b。a线程功能是读取数据库中某条记录并进行一系列计算,b线程功能是查询并修改a线程读取的那条数据的某个字段。某时刻b线程拿到cpu执行权读到该条记录,然后修改,但是没有commit到数据库中。a线程此时拿到cpu执行权,读取到旧的数据,而不是修改过后的数据。这就是脏读。楼主修改数据的方法是查出来然后再做修改最后写回数据库,其实有两种方法解决,一种是对于简单的数据加减,可以通过优化sql,使用 update table set count = count + #{num}的形式直接修改,只传入变化量。第二种就是相关业务代码加锁了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题