Spring事务的实现方式有三种
一、基于TransactionProxyFactoryBean的方式
这一种几乎不怎么使用,了解即可 。
二、基于AspectJ的XML方式
这种就是基于代理的。在spring核心配置文件配置信息 如下
<!-- (事务管理)transaction manager, use JtaTransactionManager for global tx -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 配置基于注解的声明式事务 -->
<!--<tx:annotation-driven transaction-manager="transactionManager"/>-->
<!--配置事务传播性-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!--service中的方法命名规范-->
<tx:method name="add*" propagation="REQUIRED" rollback-for="java.lang.Exception" />
<tx:method name="remove*" propagation="REQUIRED" rollback-for="java.lang.Exception" />
<tx:method name="edit*" propagation="REQUIRED" rollback-for="java.lang.Exception" />
<tx:method name="search*" propagation="SUPPORTS"/>
<!--<tx:method name="find*" propagation="SUPPORTS"/>
<tx:method name="list*" propagation="SUPPORTS"/>-->
<tx:method name="*" read-only="true"/>
</tx:attributes>
</tx:advice>
<!--组装事务传播和切入点-->
<aop:config>
<!--impl包下的所有类所有方法-->
<aop:pointcut id="pcut" expression="execution(* com.ssm.develop.service.impl.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="pcut"/>
</aop:config>
我会分开给大家讲解,首先这一块是配置的事务管理器 ,你用谁的管理器就在class后面加对应的,这个使用的是JDBC的
<!-- (事务管理)transaction manager, use JtaTransactionManager for global tx -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
这是资料,有兴趣的同学可以收藏下
org.springframework.jdbc.datasource.DataSourceTransactionManager:使用JDBC或者iBatis进行持久化数据时使用
org.springframework.orm.hibernate5.HibernateTransactionManager:使用hibernate5版本进行持久化数据时使用
org.springframework.orm.jpa.JpaTransactionManager:使用JPA进行持久化数据时使用
org.springframework.jdo.JdoTransactionManager:当持久化机制是jdo时使用
org.springframework.transaction.jta.JtaTransactionManager:使用一个JTA实现来管理事务,在一个事务跨越多个资源时必须使用
下面的就是设置传播性和切入点,就是你想在哪里开启事务,这个是service所有的实现类,其中的add,remove,edit,search,find,list 开头的方法设置的传播性不同,propagation后面的关键字是对应的传播性,这里不多讲传播性,简单的提一下,这种就是基于AspectJ的XML方式。
最后一种就是基于注解的方式,也是大家最熟悉 最喜欢用的,最简单的。
<!-- (事务管理)transaction manager, use JtaTransactionManager for global tx -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!--开启事务注解-->
<tx:annotation-driven transaction-manager="transactionManager" />
没错就是这么简单 ,在需要开启的事务的方法上面加上@Transactional 即可
/**
* 自动升级申请提交
* @param listSid listUpdateData
* @return Result
* */
@Override
@Transactional
public Result editTPropKbnApplStatus(List<String> listApplNo,List<String> listUpdateData) {
好了说道这里就结束了,关于事务基础知识大家随便就可以找到,我就不复制粘贴了,但是有点东西还是告诉大家,能用Spring自动事务的就不要手动事务,不然一个程序那么多删除添加修改操作,那将是一个大批冗余的代码,后期维护起来也很难。单体程序的事务难点不多,重点是分布式框架的事务。这个我们以后再讲。