例:A账户金额有1000元,另有B账户,C账户;现有两个独立事务同时进行;
1,将A账户的1000块钱转到B账户;
2,将A账户的1000块钱转到C账户;
事务的操作:A,-1000 B/C,+1000;
是不是会存在这种情况:
执行事务时,由于没有真正修改数据库,两个事务都是合法;
执行完事务,实际保存数据时,后保存数据A账户钱数会报错(金额不会修改),而C账户钱会增加;
导致,B,C账户增加总和大于A账户减少的金额?
spring事务控制转账问题
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
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时出现报错如何解决