NIUCLOUD是一款SaaS管理后台框架多应用插件+云编译。上千名开发者、服务商正在积极拥抱开发者生态。欢迎开发者们免费入驻。一起助力发展! 广告
~~~ /** * 事务的传播行为 。。。 * * @当一个事务方法,调用另外一个事务方法的时候。 * 第一个方法已经在一个事务中了,第二个方法是用第一个方法的事务,还是新开启一个事务。@ * * * * * * * 适用propagation指定事务的传播行为,即当前的事务方法被另外一个事务方法调用时如何使用事务。 * PROPAGATION_REQUIRED 是事务的默认传播行为,即使用调用方法的事务。 * * * 举例,张三有500积分,同时换购两件商品 2(100),3(500)... 那么到底是能够换购1件商品还是都不行? * * 请再读一遍被@所标注的话,然后再来看例子。 * 将事务的传播行为改成PROPAGATION_REQUIRES_NEW。 * * * (常用的两个PROPAGATION_REQUIRED,PROPAGATION_REQUIRES_NEW) * REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。 * REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。 * SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。 * MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。 * NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 * NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。 * NESTED-- 如果有事务在运行,当前的方法就应该在这个事务的嵌套事务内运行,否则就启动一个新的事务,并在它自己的事务内运行。 * * * isolation 设置事务的隔离级别 isolation=Isolation.READ_COMMITTED 最常用 * * 默认spring声明式事务对所有异常回滚,也可以去做设置,但是一般不做。 * * * 使用readOnly 指定事务是否为只读,由于事务可以在行和表上获得锁,因此长事务会占用资源,对整体性能产生影响。 * 如果一个事务只读取数据,但是不做修改,数据库引擎可以对这个事务进行优化。 * * 超时事务属性,事务在强制回滚之前可以保持多久,这样可以防止长期运行的事务占用资源。timeout 秒。 * * 只读事务,表示这个事务只读取数据但不更新数据,这样可以帮助数据库引擎优化事务。 ~~~ ~~~ 配置事务三个步骤: * <!-- 1.配置事务管理器 DataSourceTransactionManager --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> <!-- 2.添加一个让注解生效的驱动 默认值就是transactionManager--> <tx:annotation-driven transaction-manager="transactionManager"/> *3.@Transactional */ ~~~ `propagation=Propagation.REQUIRES_NEW` 可以单独换购一件商品 默认 `propagation=Propagation.REQUIRED`不可以换购商品 timeout=3 说的是3秒之后事务回滚 都失败 ![](https://box.kancloud.cn/cf266eb8c790060b2a30841afc4c8de3_1133x541.png)