JdbcTemplate中如何进行事务的传播机制设置?

JdbcTemplate支持设置事务的传播机制。事务传播机制指的是,当一个事务方法被另一个事务方法调用时,这个事务应该如何进行。

JdbcTemplate允许设置以下几种事务传播机制:

  • PROPAGATION_REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务。(默认机制)
  • PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。
  • PROPAGATION_MANDATORY:支持当前事务,如果当前没有事务,就抛出异常。
  • PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。
  • PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
  • PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
  • PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行PROPAGATION_REQUIRED的事务传播机制

设置事务传播机制的步骤如下:

  1. 在 Spring 配置文件中进行事务管理器和传播机制的配置:
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>

<tx:advice id="txAdvice">
    <tx:attributes>
        <tx:method name="save*" propagation="REQUIRED"/>
        <tx:method name="delete*" propagation="REQUIRED"/>
        <tx:method name="update*" propagation="REQUIRED"/>
        <tx:method name="find*" propagation="SUPPORTS" read-only="true"/>
    </tx:attributes>
</tx:advice> 
  1. 在JdbcTemplate中添加@Transactional注解,指定传播机制:
public class UserDaoImpl implements UserDao {
    @Transactional(propagation = Propagation.REQUIRED)
    public void saveUser(User user) {
        jdbcTemplate.update(SQL_INSERT, ...); 
    }
}
  1. 调用事务方法时,事务会按指定的传播机制进行。
    例如,存在两个service, service1调用service2的事务方法:
  • service1传播机制为PROPAGATION_REQUIRED
  • service2传播机制为PROPAGATION_SUPPORTS

那么:

  • 如果service1开启事务,则service2会在该事务内执行
  • 如果service1没有事务,则service2会以非事务执行

这就实现了事务的传播。

所以,通过为JdbcTemplate的方法指定@Transactional注解,可以选择适合的事务传播机制,这给事务处理带来了更高的灵活性。