spring事务控制转账问题

问题描述

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在同一个事物中执行,也不会有任何问题.

执行事务时,由于没有真正修改数据库,两个事务都是合法;
建议你阅读相关书籍,这个是一个很基础的问题,不应该在这里问.

时间: 2024-10-15 05:37:50

spring事务控制转账问题的相关文章

面试题--关于spring事务控制的

问题描述 上周去面试,面试官问我,spring事务控制放在service层,在service方法中一个方法调用service中的另一个方法,默认开启几个事务? 解决方案 一个.spring的事务传播方式默认是PROPAGATION_REQUIRED,也就是加入当前事务(如果没有就开启一个新事务).解决方案二:默认PROPAGATION_REQUIRED,判断当前是否已开启一个新事务,有则加入当前事务,否则新开一个.共有7种方式.

sping hibernate 事务-spring注解方式事务控制没有回滚

问题描述 spring注解方式事务控制没有回滚 项目中使用到了hibernate以及spring事务控制,在service层增加事务控制但是遇到异常没有回滚. 代码如下: 配置文件 <?xml version="1.0" encoding="UTF-8"?> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springfr

spring事务不起作用

问题描述 我估计让程序报错但是数据没有回滚,是为什么,配置事务的成功例子我都有,网上的解答我基本都看过了,但是还是解决不了,拿出来跟大家分享一下,看大家能解决么??这是service里的publicvoidmodifyRoleMenus(Stringid,Stringmenuids)throwsException{if(null!=id&&menuids!=null){Queryquery=cashFlowDao.session().createSQLQuery("deletef

php+mysqli事务控制实现银行转账实例_php技巧

本文实例讲述了php+mysqli事务控制实现银行转账的方法.分享给大家供大家参考.具体分析如下: 事务控制,也就是说所有的语句执行成功后,才会提交.否则,如果前面有语句执行成功,而后面没有执行成功,则回滚到执行之前的状态.通过银行转账的案例来说明这个应用.一个账号转了钱出去,另一个账号必须有钱转入,这样才算成功. 代码如下: <?php //1.创建数据库连接对象 $mysqli = new MySQLi("localhost","root","1

spring data jpa + spring mvc的事务控制问题

问题描述 spring data jpa + spring mvc的事务控制问题 问题大概是这样的,如下@Transactionalpublic void save(A a){ a = aRepository.save(a); B b = new B();b.setAId(a.getId());bRepository.save(b); }这样是获取不到a对象的id的,因为方法没有执行完,这个事务没有提交,数据没有更新到数据库,请问如果我想在save之后通过返回的对象就能拿到主键需要怎么做,事务是

spring mvc +hibernate4事务控制问题求大神解答

问题描述 spring mvc +hibernate4事务控制问题求大神解答 web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="

spring mvc+hibernate4事务控制

问题描述 spring mvc+hibernate4事务控制 web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://

spring事务传播机制的测试结果

/**     * @Component是个一般性的注解,使用此注解修饰的POJO类,有value属性,指定bean的id.也可不写.默认值是类名首字母小写     * @Resource是控制依赖注入的,@Resource有两个属性是比较重要的,分是name和type.设置那个属性,按那个策略注入.不设置,默认按ByName策略注入.     * @Autowired是控制依赖注入.按byType自动注入.     *      * @Controller是springMVC中注解控制器的. 

Spring事务管理高级应用难点剖析: 第2部分

联合军种作战的混乱 Spring 抽象的 DAO 体系兼容多种数据访问技术,它们各有特 色,各有千秋.像 Hibernate 是非常优秀的 ORM 实现方案,但对底层 SQL 的控制不太方便: 而 iBatis 则通过模板化技术让您方便地控制 SQL,但没有 Hibernate 那样高的开发效率:自 由度最高的当然是直接使用 Spring JDBC 莫属了,但是它也是最底层的,灵活的代价是代码的 繁复.很难说哪种数据访问技术是最优秀的,只有在某种特定的场景下,才能给出答案.所以 在一个应用中,往