Spring事务问题记录

来源:互联网 发布:js中复选框的用法 编辑:程序博客网 时间:2024/05/20 04:27

1. spring配置xml事务与开启注解事务的覆盖问题 

    通过xml aop配置事务,同时开启注解@Transactional事务,并在类文件上声明时,注解事务的优先级高于配置文件,即会覆盖配置文件的事务配置。 

    如下面的配置:

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="        http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd        http://www.springframework.org/schema/context        http://www.springframework.org/schema/context/spring-context-3.0.xsd        http://www.springframework.org/schema/tx        http://www.springframework.org/schema/tx/spring-tx-3.0.xsd        http://www.springframework.org/schema/aop        http://www.springframework.org/schema/aop/spring-aop-3.0.xsd         "><!-- 开启Annotation注解注入配置 --><context:annotation-config /><!-- 读取属性文件 --><beanclass="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"><property name="locations"><list><value>classpath:com/spring/demo/config/database.properties</value></list></property></bean><!-- 整合jdbc配置 --><bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"destroy-method="close"><property name="driverClassName" value="${jdbc.driverClassName}"></property><property name="url" value="${jdbc.url}"></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" /></bean> <!-- 配置aop 切入点 和事务访问策略 -->   <aop:config>  <aop:pointcut id="serviceOperation" expression="execution(* com.spring.demo.service.impl.*.*(..)) || execution(* com.*.dao.impl.*.*(..))"/>       <aop:advisor pointcut-ref="serviceOperation" advice-ref="txAdvice"/></aop:config><tx:advice id="txAdvice" > <tx:attributes><tx:method name="del*" propagation="REQUIRED"/><tx:method name="save*" propagation="REQUIRED"/><tx:method name="add*" propagation="NOT_SUPPORTED"/><tx:method name="update*" propagation="REQUIRED"/><tx:method name="insert*" propagation="REQUIRED"/><tx:method name="create*" propagation="REQUIRED"/><tx:method name="get*" read-only="true"/><tx:method name="query*" read-only="true"/><tx:method name="select*" read-only="true"/><tx:method name="*" read-only="true" propagation="REQUIRED"/></tx:attributes></tx:advice>            <!-- 启用注解事务(通常两种事务开启一种即可,或配合使用) --><tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" /><context:component-scan base-package="com.spring.demo.service.impl" /><context:component-scan base-package="com.spring.demo.dao.impl" /><!-- SpringJdbc配置 --><bean id="jdbcTemplte" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource"></property></bean></beans>

同时在Service类上声明@Transactional,代码如下:

@Service@Transactional(rollbackFor = Exception.class)public class PersonServiceImpl implements PersonService{@Autowired<span style="white-space:pre"></span>private PersonDao personDao;@Overridepublic void addPerson(String name) {personDao.addPerson(name);int i = 1 / 0;}}

即配置文件中无事务,而注解中有事务,注解覆盖了配置文件而使这个addPerson方法具有事务,异常后事务回滚。


2. 事务不生效的一种情况

springmvc-servlet.xml这个文件即springmvc的配置文件中扫描包时,只扫描controller所在包,而不能扫描service与dao所在包,否则会导致service与dao事务失效。

正确:

<!-- 自动扫描包的注解 --><context:component-scan base-package="com.spring.demo.controller" />

错误:

<!-- 自动扫描包的注解 --><context:component-scan base-package="com.spring.demo.controller" /><context:component-scan base-package="com.spring.demo.service" /><context:component-scan base-package="com.spring.demo.dao" />


0 0
原创粉丝点击