我的项目中采用的是spring+ibatis,现在需要事务管理,由于需要事务的地方也不多,所以就直接参考spring手册,采用编程式的事务管理,但是总是不能够回滚?我的代码如下:
        ApplicationContext context = new ClassPathXmlApplicationContext("com/teamsun/uap/dao/DaoBeans.xml");
        //获取PlatformTransactionManager;
        PlatformTransactionManager transManager = (PlatformTransactionManager) context.getBean("transactionManager");
        //定义TransactionDefinition;
        DefaultTransactionDefinition transDef = new DefaultTransactionDefinition();
        //定义Transaction传播行为;
        transDef.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
        //开始一个Transaction;
       TransactionStatus ts = transManager.getTransaction(transDef);
try{
  //然后是我的数据操作逻辑,先update一条数据,然后再插入一条数据(故意让他出错)
}catch(Exception e){
  transManager.rollback(ts);
  return;
}
transManager.commit(ts);执行完毕后,查询数据库发现第一条update操作成功了,并没有回滚?后来我又换成编程式事务中的TransactionTemplate的方式,还是不能回滚.实在没办法,我又参考文档改为声明式事务管理:配置如下:
    <!-- DataSource -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <!--<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" destroy-method="close">-->
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://167.46.80.199:3306/testdb?useUnicode=true&amp;characterEncoding=UTF-8"/>
        <property name="username" value="root"/>
        <property name="password" value="root"/>
    </bean>
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>    <bean id="baseTransactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true">
        <property name="transactionManager"><ref bean="transactionManager"/></property>
        <property name="target" ref="deptService"/>
        <property name="transactionAttributes">
            <props>
                <prop key="get*">PROPAGATION_REQUIRED</prop>
                <prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
            </props>
        </property>
    </bean>
按照说明,这样配置应该就是target属性指定的deptService类中的以get开头的方法中如果出现runtimeException就会自动回滚,但是我测试还是不能回滚,看了半天,在网上也找了很久也都是说这么写的,找不到原因啊,各位高手们请指点指点啊,我实在没辙了.
拜托拜托了,高手指点啊

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【sflong】截止到2008-08-01 16:28:05的历史汇总数据(不包括此帖):
    发帖的总数量:1                        发帖的总分数:0                        每贴平均分数:0                        
    回帖的总数量:0                        得分贴总数量:0                        回帖的得分率:0%                       
    结贴的总数量:0                        结贴的总分数:0                        
    无满意结贴数:0                        无满意结贴分:0                        
    未结的帖子数:1                        未结的总分数:0                        
    结贴的百分比:0.00  %               结分的百分比:---------------------
    无满意结贴率:---------------------无满意结分率:---------------------
    如何结贴请参考这里:http://topic.csdn.net/u/20080501/09/ef7ba1b3-6466-49f6-9d92-36fe6d471dd1.html

    取消马甲机器人,请点这里:http://www.java2000.net/mycsdn/robotStop.jsp?usern=sflong
      

  2.   

    检查表类型可支持事务处理。以MySQL为例MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。