X_闲人 2015-12-17 04:34 采纳率: 0%
浏览 1882

spring事务控制转账问题

例:A账户金额有1000元,另有B账户,C账户;现有两个独立事务同时进行;
1,将A账户的1000块钱转到B账户;
2,将A账户的1000块钱转到C账户;
事务的操作:A,-1000 B/C,+1000;
是不是会存在这种情况:
执行事务时,由于没有真正修改数据库,两个事务都是合法;
执行完事务,实际保存数据时,后保存数据A账户钱数会报错(金额不会修改),而C账户钱会增加;
导致,B,C账户增加总和大于A账户减少的金额?

  • 写回答

7条回答 默认 最新

  • 晓呆同学 2015-12-17 04:53
    关注

    你考虑的这个问题还是有可能发生的,举个例子:

    我们同时抢票,你在你的浏览器中看到还剩余10张票,我在我的浏览器中看到也是还剩余10张票,如果此时:

    用我们分别查询出来的Ticket(票的实体类)中的count(剩余数量)来分别减一的话,你的count是10然后减去1变成9,我的count是10然后我也买一张减去1变成9,

    接下来我们分别去修改数据库,将票的剩余数量修改为9.

    那么我们买到了两张票,数据库中却只扣了一张~~

    出现这种问题是非常可能的。

    那么我们可以这样来杜绝这种问题的发生,我们不去这样修改,我们创建一个方法subtractCount(int num) 方法为减去多少票的方法,参数为需要减去的数量,

    我们分别将需要减去的数量1传到数据库,SQL语句为:update ticket set count = count -num where ... 那么这样我们就不会出现问题了额。

    数据库的锁机制和排他性就会保证我们的数据的正确性。

    评论

报告相同问题?

悬赏问题

  • ¥15 想问一下stata17中这段代码哪里有问题呀
  • ¥15 flink cdc无法实时同步mysql数据
  • ¥100 有人会搭建GPT-J-6B框架吗?有偿
  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决