如果是Spring + mybatis + mysql 这种架构,请求处理时加上注解@Transactional,然后执行以下操作:
读取用户金币走select语句,去查询出的值扣除一个值,然后将结果写入数据库,走update语句,应该是有并发问题的吧?
如果是Spring + mybatis + mysql 这种架构,请求处理时加上注解@Transactional,然后执行以下操作:
读取用户金币走select语句,去查询出的值扣除一个值,然后将结果写入数据库,走update语句,应该是有并发问题的吧?
有,spring事务不能保证并发的安全性。在多线程下会有脏读,幻读等问题。比如此时有两个线程a,b。a线程功能是读取数据库中某条记录并进行一系列计算,b线程功能是查询并修改a线程读取的那条数据的某个字段。某时刻b线程拿到cpu执行权读到该条记录,然后修改,但是没有commit到数据库中。a线程此时拿到cpu执行权,读取到旧的数据,而不是修改过后的数据。这就是脏读。楼主修改数据的方法是查出来然后再做修改最后写回数据库,其实有两种方法解决,一种是对于简单的数据加减,可以通过优化sql,使用 update table set count = count + #{num}的形式直接修改,只传入变化量。第二种就是相关业务代码加锁了。
15 回答8.4k 阅读
8 回答6.2k 阅读
5 回答3.2k 阅读✓ 已解决
3 回答3.6k 阅读✓ 已解决
1 回答4k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
有,需要 select for update 锁一下