0 0

关于spring+iBatis事务嵌套不回滚遇到的问题,求协助10

以下是我这边贴的自己的代码,请帮忙看下
applicationContext.xml文件的配置
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
      <property name="configLocation" value="classpath:config/sqlmap-config.xml" />
      <property name="dataSource" ref="dataSource" />
</bean>

<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
      <property name="dataSource" ref="dataSource" />
</bean>

<bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
     <property name="transactionManager" ref="txManager" />
</bean>

<bean id="templateUtils" class="net.sy599.yaolaiye.dao.impl.TransactionTemplateUtils">
    <property name="transactionTemplate" ref="transactionTemplate" />
</bean>

 

<bean id="baseService" class="net.sy599.yaolaiye.test.service.BaseService">
    <property name="dao" ref="baseDAOImp"></property>
    <property name="templateUtils" ref="templateUtils"></property>
    <property name="userServiceImpl" ref="userService"></property>
 </bean>
   
 <bean id="userService" class="net.sy599.yaolaiye.test.service.UserService">
      <property name="dao" ref="baseDAOImp"></property>
      <property name="templateUtils" ref="templateUtils">
      </property>
  </bean>
   
  <bean id="baseDAOImp" class="net.sy599.yaolaiye.test.dao.impl.BaseDAOImp">
       <property name="sqlMapClient" ref="sqlMapClient"></property>
  </bean>

 

第一个service类BaseService的实现

public class BaseService
{
    private BaseDAOImp dao;

    private TransactionTemplateUtils templateUtils;

    private UserService userServiceImpl;

    public void addUser(final Users user)
    {
        templateUtils.call(new ITransactionManager(){

            @Override
            public Users doInTransaction() throws CharException
            {
                dao.insert("user_space.insertUsers", user);
                //  调用另外一个service的deleteUser方法在该方法中引发了一个异常
                userServiceImpl.deleteUser(user.getLoginid());
                return null;
            }
           
        });

    }

    public void setDao(BaseDAOImp dao)
    {
        this.dao = dao;
    }

    public void setTemplateUtils(TransactionTemplateUtils templateUtils)
    {
        this.templateUtils = templateUtils;
    }

    public void setUserServiceImpl(UserService userServiceImpl)
    {
        this.userServiceImpl = userServiceImpl;
    }
}

 

第二个service类UserService的实现

public class UserService
{
    private BaseDAOImp dao;

    private TransactionTemplateUtils templateUtils;

    public void deleteUser(final String loginId)
    {
        templateUtils.call(new ITransactionManager(){


            @Override
            public Users doInTransaction() throws CharException
            {
                throw new CharException("aaaa");
            }
        });
    }

    public void setDao(BaseDAOImp dao)
    {
        this.dao = dao;
    }

    public void setTemplateUtils(TransactionTemplateUtils templateUtils)
    {
        this.templateUtils = templateUtils;
    }
}

 

这个是我自己写的一个公共事务类

public class TransactionTemplateUtils
{
    private TransactionTemplate transactionTemplate;

    @SuppressWarnings( "unchecked" )
    public boolean call(final ITransactionManager manager)
    {
         return (Boolean) transactionTemplate.execute(new TransactionCallback(){
            @Override
            public Object doInTransaction(TransactionStatus status)
            {
                Object result;
                 try
                 {

                    // 通过接口回调service方法执行
                     result = manager.doInTransaction(); 
                 }
                 catch (CharException e)
                 { 
                     status.setRollbackOnly();
                     result = false; 
                     throw new RuntimeException(e.getMsgContext(), e); 
                 } 
                 return result; 
            }
         });
    }
   
    public void setTransactionTemplate(TransactionTemplate transactionTemplate)
    {
        this.transactionTemplate = transactionTemplate;
    }
}

问题: 第一个service提交了数据库,但是在第2个service抛出异常后,怎么第一个service提交的数据怎么没有回滚啊。。请帮忙分析下。。谢谢


问题补充
晕。。。。 没人知道怎么回事么 ,,怎么没人回帖啊。。。。。
问题补充
那怎么样设置提交虚拟事务等都做玩了在一起提交呢。。。  我通过template模版管理类设置一个
PROPAGATION_NESTED如果一个活动的事务存在,则运行在一个嵌套的事务中. 如果没有活动事务, 则按TransactionDefinition.PROPAGATION_REQUIRED 属性执行

这样的属性好像都不起效果啊。
问题补充
我开始之前也也重新把TransactionTemplate的excuete方法重写了。。后来运行后出现事务已经提交和回滚这样的异常。。还有设置手动提交事务的属性怎么设置啊。。。  请指教下代码啊。。。  我这个还是以前在项目里面看见别人是这样写的事务才做的。。。。 不知道为什么不行。。。
2012年5月21日 15:12

2个答案 按时间排序 按投票排序

0 0

ibatis默认是自动提交事务的 需先配置成手动提交
可以在dataSource中配置
<property name="defaultAutoCommit" value="false"/>

2012年5月21日 15:12
0 0

如果提交过的事务能回滚,那提交事务还有什么意义~~!

2012年5月21日 15:12

相关推荐

    Spring+Struts2+Spring3+Hibernate3三大框架整合

    - PROPAGATION_NESTED:如果已有事务,就在当前事务中创建一个嵌套事务;没有则新建一个。 在实际开发中,例如在删除客户和订单的场景下,可以使用PROPAGATION_REQUIRES_NEW,确保订单删除失败时,不会影响客户...

    iBatis 轻量级持久层架构

    - **事务管理**:根据业务需求合理设置事务隔离级别,避免不必要的回滚和锁表。 - **合理使用参数绑定**:避免使用字符串拼接SQL,而是使用预编译的参数化查询,提高SQL执行效率并减少SQL注入。 iBatis的设计目标...

    ibatis+mysql

    - **配置Spring**(可选):如果项目使用Spring框架,可以将Ibatis与Spring整合,通过Spring管理SqlSessionFactory和Mapper接口的实例。 - **编写Java代码**:在业务逻辑中,通过SqlSession和Mapper接口执行SQL...

    Spring-Reference_zh_CN(Spring中文参考手册)

    12.2.4. 不使用回调的基于Spring的DAO实现 12.2.5. 基于Hibernate3的原生API实现DAO 12.2.6. 编程式的事务划分 12.2.7. 声明式的事务划分 12.2.8. 事务管理策略 12.2.9. 容器资源 vs 本地资源 12.2.10. 在应用服务器...

    ibatis 开发指南

    该指南不仅涵盖了ibatis的基础使用,还深入讲解了其高级特性,包括数据关联、动态映射、事务管理和缓存机制等,是ibatis用户不可或缺的学习资料。 ### ibatis基础语义 #### XmlSqlMapClientBuilder与SqlMapClient ...

    ibatis开发指南

    iBatis可以很好地与Spring框架集成,实现依赖注入和事务管理。 总结来说,《iBatis开发指南》是学习iBatis的绝佳起点,它将引导你了解如何配置和使用iBatis,以实现高效的数据访问。通过深入学习,你可以掌握...

    Spring 2.0 开发参考手册

    12.2.4. 不使用回调的基于Spring的DAO实现 12.2.5. 基于Hibernate3的原生API实现DAO 12.2.6. 编程式的事务划分 12.2.7. 声明式的事务划分 12.2.8. 事务管理策略 12.2.9. 容器资源 vs 本地资源 12.2.10. 在应用...

    spring chm文档

    Spring Framework 开发参考手册 Rod Johnson Juergen Hoeller Alef Arendsen Colin Sampaleanu Rob Harrop Thomas Risberg Darren Davison Dmitriy Kopylenko Mark Pollack Thierry Templier Erwin ...

    Spring中文帮助文档

    12.2.4. 不使用回调的基于Spring的DAO实现 12.2.5. 基于Hibernate3的原生API实现DAO 12.2.6. 编程式的事务划分 12.2.7. 声明式的事务划分 12.2.8. 事务管理策略 12.2.9. 容器资源 vs 本地资源 12.2.10. 在应用...

    Spring API

    12.2.4. 不使用回调的基于Spring的DAO实现 12.2.5. 基于Hibernate3的原生API实现DAO 12.2.6. 编程式的事务划分 12.2.7. 声明式的事务划分 12.2.8. 事务管理策略 12.2.9. 容器资源 vs 本地资源 12.2.10. 在应用...

    SQL&Ibatis学习 ppt

    4. Session与事务管理:学习如何使用SqlSession对象执行SQL,以及如何进行事务的开启、提交和回滚。 5. 强大的功能:了解Ibatis的缓存机制、结果集映射(包括一对一、一对多、多对多)、延迟加载等功能,以及如何...

    mybatis-3.2.8jar包及其源码jar包

    - MyBatis不直接管理事务,而是依赖于容器(如Spring)进行事务控制。 - **SqlSession的commit()和rollback()**:用于提交和回滚事务。 7. **插件机制** - MyBatis支持自定义插件,通过拦截器对SqlSession的操作...

    mybatis 3.0

    手动模式下,开发者需要自行控制事务的开启、提交和回滚;自动模式下,可以通过配置让MyBatis与Spring等框架集成,实现声明式事务管理。 10. **插件扩展**: MyBatis允许用户自定义插件,这些插件可以在执行SQL语句...

Global site tag (gtag.js) - Google Analytics