问题描述
- spring事务控制转账问题
-
例:A账户金额有1000元,另有B账户,C账户;现有两个独立事务同时进行;
1,将A账户的1000块钱转到B账户;
2,将A账户的1000块钱转到C账户;
事务的操作:A,-1000 B/C,+1000;
是不是会存在这种情况:
执行事务时,由于没有真正修改数据库,两个事务都是合法;
执行完事务,实际保存数据时,后保存数据A账户钱数会报错(金额不会修改),而C账户钱会增加;
导致,B,C账户增加总和大于A账户减少的金额?
解决方案
spring事务问题:没有提交
关于Spring事务回滚的问题
关于Spring事务回滚的问题
解决方案二:
你考虑的这个问题还是有可能发生的,举个例子:
我们同时抢票,你在你的浏览器中看到还剩余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 ... 那么这样我们就不会出现问题了额。
数据库的锁机制和排他性就会保证我们的数据的正确性。
解决方案三:
为什么没有加锁呢?一个事务操作时锁上,处理完后释放了锁,才能第二个事务处理。
解决方案四:
这个就是涉及到spring事务脏读的问题,一般不会允许两个事务同时进行的
解决方案五:
这个就是涉及到spring事务脏读的问题,一般不会允许两个事务同时进行的
解决方案六:
这个就是涉及到spring事务脏读的问题,一般不会允许两个事务同时进行的
解决方案七:
这种情况不会发生的,在事务传播行为中,一般设置两个操作在同一个事务中,报错都会回滚
解决方案八:
呵呵,数据库如果连这种基本问题都无法解决,还叫数据库吗?
你说的这个其实和spring完全没有关系.
begin work
update a set n=n-1000 where id=1
update b set n=n+1000 where id=2
commit work
这样的事务可以保证不出任何并发问题,前提是两条记录都存在.
同时再执行
begin work
update a set n=n-100 where id=1
update c set n=n+100 where id=3
commit work
也没问题,这两个事务将顺序执行,因为任何一个事物先执行的话,都会锁定a中id=1的记录,后一个事务必须等待
所以如果你用spring管理事务,让这两条SQL在同一个事物中执行,也不会有任何问题.
执行事务时,由于没有真正修改数据库,两个事务都是合法;
建议你阅读相关书籍,这个是一个很基础的问题,不应该在这里问.