目标: 了解事务的一些相关内容
**
1. noRollbackFor和noRollbackForClassName测试不回滚的异常
/**
* noRollbackFor=ArithmeticException.class 表示当接收到数学异常之后。不回滚<br/>
* noRollbackFor=ArithmeticException.class<br/>
* noRollbackForClassName="java.lang.ArithmeticException" 表示当接收到指定字符串表示的全类名的异常的时候,不回滚事务
* noRollbackFor 和 noRollbackForClassName
* 可以指定某些异常不回滚
*
* spring 默认只回滚运行时异常 不回滚检查时异常
*/
@Transactional()
public void updateTwoTable() {
userDao.updateUser();
int i = 12 / 0;
bookDao.updateBook();
}
2. 自定义设置回滚异常
/**
* spring默认回去的是运行时异常RuntimeException和RuntimeException的子异常<br/>
* rollbackFor=FileNotFoundException.class 表示FileNotFoundException也会回滚
* rollbackForClassName="java.io.FileNotFoundException" 表示当出现配置字符串所向定的全类名的异常的时候。也会回滚事务
* @throws FileNotFoundException
*
*/
@Transactional()
public void updateTwoTable() throws FileNotFoundException {
userDao.updateUser();
int i = 0;
if (i == 0) {//java.io.FileNotFoundException
throw new FileNotFoundException("sadf");
}
bookDao.updateBook();
}
3. 事务的只读属性
/**
* readOnly 如果值为true。表示只支持查询操作。不支持写操作
* <br/>如果设置为false,支持全部
*/
@Transactional(readOnly=true)
public void updateTwoTable() throws FileNotFoundException {
userDao.updateUser();
bookDao.updateBook();
}
4. 事务超时属性timeout(秒为单位)
/**
* timeout=3表示操作不能超过3秒
*/
@Transactional(timeout=3)
public void updateTwoTable() throws FileNotFoundException {
userDao.updateUser();
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
e.printStackTrace();
}
bookDao.updateBook();
}
5. 事务的传播特性propagation
关键: Required 用于组合事务 requires_new 用于拆分事务,
掌握: 理解他们的区别
什么是事务的传播行为:
当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。例如:方法可能继续在现有事务中运行,也可能开启一个新事务,并在自己的事务中运行。
事务的传播行为可以由传播属性指定。Spring定义了7种类传播行为。
6. xml配置式事务声明
注: 去掉所有@Transaction
<!-- 配置DataSourceTransactionManager事务管理器===事务的切面类 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 事物特性 -->
<tx:advice id="tx_advice" transaction-manager="transactionManager">
<!-- 配置事务特性 -->
<tx:attributes>
<tx:method name="multiUpdate" propagation="REQUIRED"/>
<tx:method name="updateBook" propagation="REQUIRES_NEW" />
<tx:method name="updateUser" propagation="REQUIRED"/>
<tx:method name="*" read-only="true"/>
</tx:attributes>
</tx:advice>
<!-- 配置aop代理 -->
<aop:config>
<aop:advisor advice-ref="tx_advice" pointcut="execution(* com.zhuama.service.*Service.*(..))" />
</aop:config>
7.
8.
9. 总结
/**
* noRollbackFor 和 noRollbackForClassName
* 可以指定某些异常不回滚
*
* spring 默认只回滚运行时异常 不回滚检查时异常
* rollbackFor 和 rollbackForClassName
*
* readOnly 属性 添加后该方法只允许使用查询功能 不允许增删改操作
*
* timeout 属性 事务的超时属性
* timeout = 秒数 可以使一个事务如果超过一定时间 提示超时 自动回滚
*
*
* propagation 属性 事务的传播特性
* 常用的两种 : REQUIRED 标记为当前值的事务 如果执行过程中发现已经有事务了 则使用当前存在的事务 如果没有 则新开启事务
* REQUIRES_NEW 标记为当前值的事务 如果执行过程中发现已有事务了 则暂停(挂起)当前事务 开启一个独立的新事物
*
* Required 用于组合事务 requires_new 用于拆分事务
*
* */
评论 (0)