1. 使用TransactionTemplate手动提交事务
spring配置
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource ">
<property name="url" value="${jdbc.url}"></property>
<property name="driverClassName" value="${jdbc.driver}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 注入连接池对象 -->
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 配置事务管理的模板:Spring为了简化事务管理的代码而提供的类 -->
<bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager" ref="transactionManager"></property>
</bean>
业务代码
@Autowired
private TransactionTemplate transactionTemplate;
@Override
public void xxx(...) {
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus arg0) {
//TODO 实现业务
}
});
}
2. 使用TransactionProxyFactoryBean代理提交事务
spring配置
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource ">
<property name="url" value="${jdbc.url}"></property>
<property name="driverClassName" value="${jdbc.driver}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 注入连接池对象 -->
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 配置业务层的代理 -->
<bean id="accountServiceProxy"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<!-- 配置目标对象 -->
<property name="target" ref="accountService"/>
<!-- 注入事务管理器 -->
<property name="transactionManager" ref="transactionManager"/>
<!-- 注入事务属性 -->
<property name="transactionAttributes">
<props>
<!-- prop格式:
* PROPAGATION :事务的传播行为。
* ISOLATION :事务的隔离级别。
* readOnly :只读。
* -Exception :发生哪些异常回滚事务。
* +Exception :发生哪些异常事务不会滚。 -->
<prop key="transfer*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
业务代码
@Override
public void xxx(...) {
//TODO 实现业务
}
功能代码
//使用代理
@Resource(name = "accountServiceProxy")
private AccountService accountService;
3. 使用AOP配置事务(常用)
spring配置
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource ">
<property name="url" value="${jdbc.url}"></property>
<property name="driverClassName" value="${jdbc.driver}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 注入连接池对象 -->
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 配置事务的通知:(事务的增强) -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!--
propagation :事务传播行为
isolation :事务隔离级别
read-only :只读
rollback-for:发生哪些异常回滚
no-rollback-for:发生哪些异常不回滚
timeout :过期信息
-->
<tx:method name="transfer*" propagation="REQUIRED"/>
<tx:method name="add*" propagation="REQUIRED" isolation="READ_COMMITTED"
rollback-for="java.lang.Exception"/>
</tx:attributes>
</tx:advice>
<!-- 配置切面 -->
<aop:config>
<!-- 配置切入点 -->
<!-- 第一个*:任意返回值,+:AccountService所有子类,*任意的方法,(..)任意的参数 -->
<aop:pointcut id="pointcut1" expression="execution(* com.test.spring.demo3.AccountService+.*(..))" />
<aop:pointcut id="pcut" expression="execution(* com.*.service.*.*.*(..))"/>
<!-- 切面 -->
<!-- advisor只配置1个切点,aspect配置多切点 -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut1"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="pcut"/>
</aop:config>
<!-- 注解扫描 -->
<context:component-scan base-package="com.test.spring"/>
业务代码
@Override
public void xxx(...) {
//TODO 实现业务
}
功能代码
@Autowired
private AccountService accountService;
4. 注解方式(常用)
spring配置
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource ">
<property name="url" value="${jdbc.url}"></property>
<property name="driverClassName" value="${jdbc.driver}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 注入连接池对象 -->
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 注解扫描 -->
<context:component-scan base-package="com.test.spring.demo4"/>
<!-- 开启注解事务 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
业务代码
@Transactional(propagation = Propagation.REQUIRED)
public class XxxServiceImpl implements XxxService {
@Autowired
private XxxDao xxxDao;
@Override
public void xxx(...) {
//TODO 实现业务
}
}
功能代码
@Autowired
private XxxService xxxtService;
案例代码
gitee地址