17-Spring-事务的相关...

starrylsi
2024-09-13 / 0 评论 / 20 阅读 / 正在检测是否收录...

目标: 了解事务的一些相关内容

**

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

评论 (0)

取消