yayajiangyayajiang 2018-07-28 02:43 采纳率: 33.3%
浏览 722
已结题

spring数据库操作一致性问题

同行们,本人菜鸟,有个问题想问下,希望不吝赐教!
比如数据有条记录,如果我需要修改这条记录的余额balance字段,为了防止并发操作的影响,是不是得先加锁,
java代码执行sql顺序是不是这样的:

 select balance from table where id=1 for update;
double money = getBalance(sql);
//一些业务代码
update table set balance=money-100 where id=1;

这是jdbc代码这样写的,
如果用spring的话,也是类似吗?这个和隔离级别有关系吗,需要手工加上for update吗,没看懂spring是如何控制这种操作的

  • 写回答

4条回答 默认 最新

  • _zming 2018-07-28 04:38
    关注

    这个跟spring没关系吧,spring主要是控制事物的吧,比如update出错了,对数据库进行回滚。但具体的并发主要还是靠数据库锁或java代码同步来控制吧
    。你上面的代码第一行for update是使用的数据库的行锁,也就是在你这三行代码执行并提交事物前,都不会释放锁,因此其他事物就不能对这一行进行更新,所以是安全的。
    但如果你没有使用数据库的锁 ,那你这3行代码要同步操作,因为money查询之后可能会被别人修改,所以update可能会更新成脏数据。但代码加锁不能阻止你直接登录数据库操作修改字段的值,所有要确保所有修改操作都是通过代码进行,这样通过代码进行加锁才安全。
    如果可以,这样写更安全update table set balance=money-100 where id=1 and money = money;

    不管怎么样,要保证一致性都是通过锁来控制的,代码锁或数据库锁,再等等看有没有专家帮你

    评论

报告相同问题?

悬赏问题

  • ¥100 有人会搭建GPT-J-6B框架吗?有偿
  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名