配置文件 参考:
[url]http://www.iteye.com/problems/47560[/url]
问题描述:
1.0 肯定数据库 mysql 只是事物会滚! 类型 InnoDB
2.0 配置估计也没错 问题的情况反映出来的
现象:
1.0 声明式事物配置时
junit 测试事物正常回滚
页面请求 方式 回滚失败! 通一个service 方法
2.0 注解 annotation配置:
junit 测试事物正常回滚
页面请求 方式 回滚失败! 通一个service 方法
求解! 在线!
[quote]为什么呢? 百思不得其解!???
反正 applicationcontext.xml也是web 容器加载的啊! [/quote]
这是SpringMVC的bug,在SpringMVC文件加载后,在以前配置的注解方式AOP策略会失效。
但是你的是xml方式的AOP,,,不知道会不会有问题。。。
在applicationContext.xml配置:
[code="java"]
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />
[/code]
在业务类中:
[code="java"]
@Service
@Transactional
public class GameManager {
@Transactional (readOnly=false, isolation = Isolation.READ_COMMITTED)
public void saveGame(GameClassEntity o) {
this.GameDao.saveGame(o);
}
}
[/code]
<tx:advice id="transactionAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="save*" />
<tx:method name="*" read-only="true" />
</tx:attributes>
</tx:advice>
save 方法没有定义是required
所以事务是无效的。
@Service
@Transactional
public class GameManager {
@Transactional (readOnly=false, isolation = Isolation.READ_COMMITTED)
public void saveGame(GameClassEntity o) {
this.GameDao.saveGame(o);
}
}
使用注解的话
(propagation=Propagation.REQUIRED 添加方法是要开启注解的。
你有2个都没开启事务
@Transactional 默认就是 propagation=Propagation.REQUIRED
也有默认值的
AOP的看的眼花,给你我的声明式配置,运行是正确的。
[code="java"]
<!-- 定义事务拦截器 -->
<bean id="transactionInterceptor"
class="org.springframework.transaction.interceptor.TransactionInterceptor">
<!-- 注入事务管理 -->
<property name="transactionManager" ref="transactionManager"/>
<property name="transactionAttributes">
<!-- 定义事务传播属性 -->
<props>
<prop key="update*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="delete*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="save*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="is*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
<!-- 定义BeanNameAutoProxyCreator-->
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<!-- 指定对满足哪些bean name的bean自动生成业务代理 -->
<property name="beanNames">
<!-- 下面是所有需要自动创建事务代理的bean-->
<list>
<value>*Service</value>
</list>
<!-- 此处可增加其他需要自动创建事务代理的bean-->
</property>
<!-- 下面定义BeanNameAutoProxyCreator所需的事务拦截器-->
<property name="interceptorNames">
<list>
<!-- 此处可增加其他新的Interceptor -->
<value>transactionInterceptor</value>
</list>
</property>
</bean>[/code]
对比看看。
能帖上一些源码么,尤其是junit怎样调用service的,而页面中又是怎样调用service的。service中事务如何控制的。
初步看所有配置都是正确的。
[code="java"]@Transactional(readOnly=false,propagation=Propagation.REQUIRED)
public void saveGame(GameClassEntity o) {
this.GameDao.saveGame(o);
List list=new ArrayList();//异常
System.out.println(list.get(2));
}
[/code]
建议打开DEBUG日志,观察saveGame调用之前的事务,后台会把事务调用情况及事务配置都给输出来,你比较下有什么不同。
将
配置到springmvc-servlet.xml的配置文件中,而不是applicationcontext.xml
在spring中配置
;
class="org.springframework.orm.jpa.JpaTransactionManager">
ref="entityManagerFactory" />
;
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
applicationContext.xml中将事务配置在服务层中:
[code="java"]
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 事务代理拦截器的配置-->
PROPAGATION_REQUIRED,-Exception
PROPAGATION_REQUIRED,-Exception
PROPAGATION_REQUIRED,-Exception
PROPAGATION_REQUIRED,readOnly
[/code]
检查一下你操作的对象是否在这个包下:com.base.service..*.*(..))
有一次我这就出现了这个问题,就是这一点不小心
什么异常?
用什么连接的数据库?