spring 事物

配置文件 参考:

[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]

aop:config


/aop:config

检查一下你操作的对象是否在这个包下:com.base.service..*.*(..))

有一次我这就出现了这个问题,就是这一点不小心

什么异常?

用什么连接的数据库?