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 MATLAB怎么通过柱坐标变换画开口是圆形的旋转抛物面?
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题
  • ¥15 Visual Studio问题
  • ¥20 求一个html代码,有偿