Spring声明式事务管理
1.在Spring的applicationContext.xml中配置事务管理者
PS:具体的说明请看代码中的注释
Xml代码:
<!-- 声明式事务管理的配置 --> <!-- 添加事务管理者的bean --> <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager"> <!-- 为事务管理者类中的sessionFactory属性注入一个具体的实例 --> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <!-- 通知的配置 --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <!-- 指定需要开启并提交事务的方法 --> <tx:method name="add*" propagation="REQUIRED" /> <tx:method name="del*" propagation="REQUIRED" /> <tx:method name="mod*" propagation="REQUIRED" /> <!-- 指定以上方法除外的方法是只读的 read-only --> <tx:method name="*" propagation="REQUIRED" read-only="true" /> </tx:attributes> </tx:advice> <!-- 切面的配置(aop原理这里不多说,我的博文中有详细文章) --> <aop:config> <!-- 声明一个切入点 --> <aop:pointcut id="interceptorPointCuts" expression="execution(* app.dao.*.*(..))" /> <!-- 引用一个通知并且同时引用一个需要执行的切入点 --> <aop:advisor advice-ref="txAdvice" pointcut-ref="interceptorPointCuts" /> </aop:config>
1_1.运行项目
程序报错如下:
org.springframework.beans.factory.BeanDefinitionStoreException
原因是缺少jar包{org.aopalliance}
Caused by: java.lang.ClassNotFoundException: org.aopalliance.intercept.MethodInterceptor
1_2.添加jar包,将这4个jar包导入到项目的lib目录下
2.使用Spring提供的事务注解
@Transactional [使用事务注解,告诉Spring当前位类中需要事务的开启和提交,注解代码位置可以出现在类定义的前面或者方法上面]
@Transactional(readOnly=true) [使用事务注解,告诉Spring当前方法不需用到事务,只读]
类定义的前面声明事务注解,个别不需用到事务的方法设置为只读
Java代码:
@Transactional public class BcServiceImpl implements BcService { @Autowired private BcDao bd; @Override @Transactional(readOnly=true) public List<BookCard> getAllBc() { // TODO Auto-generated method stub return bd.getAllBc(); } @Override public String delSingleBc(Integer cid) { // TODO Auto-generated method stub return bd.delSingleBc(cid); } }
只在方法上声明事务注解,即每个方法上都进行事务注解的声明
Java代码:
public class BcServiceImpl implements BcService { @Autowired private BcDao bd; @Override @Transactional(readOnly=true) public List<BookCard> getAllBc() { // TODO Auto-generated method stub return bd.getAllBc(); } @Override @Transactional public String delSingleBc(Integer cid) { // TODO Auto-generated method stub return bd.delSingleBc(cid); } }
2_1.在Spring的applicationContext.xml中,添加一个驱动的bean,事务管理者
【PS:添加事务驱动者的bean后,通知的配置{<tx:advice />}和切面的配置{<aop:config />}都删除掉】
Xml代码:
<!-- 声明式事务管理的配置 --> <!-- 添加事务管理者的bean --> <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager"> <!-- 为事务管理者类中的sessionFactory属性注入一个具体的实例 --> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <!-- 添加一个驱动的bean,事务管理者 --> <tx:annotation-driven transaction-manager="transactionManager"/>