1 ,@Transactional:事务注解,
service层配置:
<context:component-scan base-package="com.huyutao.service"/>
<!-- 事务 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--配置事务注解的驱动-->
<tx:annotation-driven transaction-manager="transactionManager"/>
(1):它可以标注在类上表示该类所有的方法都注册了事务
(2):它还可以标注在方法上面,表示该方法注册了事务
注意:二者皆有则根据就近原则
2 通过面向切面来实现事务:
service的配置如下:
<context:component-scan base-package="com.huyutao.service"/>
<!-- 事务 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<tx:advice transaction-manager="transactionManager" id="txAdvice">
<tx:attributes>
<tx:method name="add*" propagation="REQUIRED" />
<tx:method name="delete*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="query*" propagation="REQUIRED" />
<!-- <tx:method name="*" propagation="REQUIRED" />-->
</tx:attributes>
</tx:advice>
<!-- 配置事务切面 -->
<aop:config>
<aop:pointcut id="serviceTrans" expression="execution(* com.huyutao.service.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceTrans"></aop:advisor>
</aop:config>
<import resource="classpath:spring-dao.xml"/>
<tx:method name="add*" propagation="REQUIRED" />
(1)name="add*" :别名,约定查询方法名为add开头的方法注册事务
(2)name="*" 表示所有的方法都注册事务
事务的传播特性propagation:
(1)REQUIRED:(默认)如果没有就新建一个事务,如果有就加入当前事务,适合绝大多数情 况。
(2)SUPPORTS: 如果当前没有事务,就以非事务方式执行。
(3)MANDATORY: 如果当前没有事务,就抛出异常。
(4)REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。
(5)NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事 务,就把当 前事务挂起。
(6)NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
(7)NESTED:支持当前事务,新增 Savepoint 点,与当前事务同步提交或回滚。