spring的两种事务
1、事务
spring支持编程式事务管理和声明式事务管理两种方式。
编程式事务使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。对于编程式事务管理,spring推荐使用TransactionTemplate。
声明式事务是建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。声明式事务最大的优点就是不需要通过编程的方式管理事务,这样就不需要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相关的事务规则声明(或通过基于@Transactional注解的方式),便可以将事务规则应用到业务逻辑中。
声明式事务的配置
DataSourceTransactionManager是事务管理器的类型,
<bean id="transactionManager" class="org.springframework.jdbc.datasource.
DataSourceTransactionManager">
<!-- 注入数据源 -->
<property name="dataSource" ref="dataSource"/>
</bean>
事务管理器的配置
<tx:advice id="txAdvice" transaction-manager="transactionManager"></tx:advice>
transaction-manager :需要依赖的事务管理器
id : 事务配置的唯一标识
<!-- 配置AOP把上面的事务配置切入到Service层 -->
<aop:config>
</aop:config>
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.
DataSourceTransactionManager">
<!-- 注入数据源 -->
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 事务的配置
<tx:advice transaction-manager="transactionManager"></tx:advice>
transaction-manager :需要依赖的事务管理器
id : 事务配置的唯一标识
-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<!-- 事务的属性配置 -->
<tx:attributes>
<!--
<tx:method name=""/>
需要被事务管理的方法 ,一般是都是service层的方法
name : 被事务管理的方法名
isolation :事务的隔离级别(REPEATABLE_READ)
propagation : 事务的传播规则 (REQUIRED)
read-only :是否是只读事务,默认false(DML 非只读事务,DQL
:只读事务-效率相对高一些)
timeout:配置事务超时时间
-->
<!-- <tx:method name="trans" isolation="REPEATABLE_READ"
propagation="REQUIRED" read-only="false"/> -->
<!-- 事务方法配置细节
在实际开发中service的方法必须遵循一定编写规则
DQL最好指定 前缀规则 : selectXxx,queryXxx, findXxx,getXxx
我们可以使用 * 来配置指定规则的所有方法
DQL 一般配 只读事务
read-only="true"
DML 一般配 非只读事务
read-only="false"
-->
<!-- DQL 方法 -->
<tx:method name="select*" read-only="true" isolation="REPEATABLE_READ"
propagation="REQUIRED" />
<tx:method name="find*" read-only="true" isolation="REPEATABLE_READ"
propagation="REQUIRED" />
<tx:method name="get*" read-only="true" isolation="REPEATABLE_READ"
propagation="REQUIRED" />
<tx:method name="query*" read-only="true" isolation="REPEATABLE_READ"
propagation="REQUIRED" />
<!-- DML 方法 * 号一定要在最后配置 -->
<tx:method name="*" read-only="false" isolation="REPEATABLE_READ"
propagation="REQUIRED" />
</tx:attributes>
</tx:advice>
<!-- 配置AOP把上面的事务配置切入到Service层 -->
<aop:config>
<!-- 配置切入点 -->
<aop:pointcut expression="execution(* cn.zj.spring.service..*.*(..))" id="pt"/>
<!-- 配置事务切面: 切入点加通知
事务默认使用的环绕通知
<aop:aspect></aop:aspect> :开发者自定功能进行aop配置事务
AOP对象事务管理配置的标签
<aop:advisor advice-ref=""/>
advice-ref :事务配置的 id
pointcut-ref :切入点引用
-->
<aop:advisor advice-ref="txAdvice" pointcut-ref="pt"/>
<!-- Weaving : 织入,spring处理 -->
</aop:config>
编程式事务