是这样的,通常大家都会在数据访问层做数据的持久化的工作,如下列方法saveDao1();
saveDao2();这两个方法分别将不同的信息保存在不同的数据表中,如果这时业务上有需求的话,我们会在业务层做逻辑处理,如下
public saveService(int i){    if(i == 100){
        saveDao1();
    }else if(i == 200 ){
        saveDao2();
    }else{
        saveDao1();
        saveDao2();
    }
}这时,如果传入的参数 i 不等与100,也不等于200 那么会执行到
        saveDao1();
        saveDao2();此时,如何保证两个操作都成功呢? (注:这两个方法操作的是同一数据库)
希望大家给点思路,spring的管理事务就不要说了,这里不讨论框架,只讨论JDBC操作实现事务的方法。

解决方案 »

  1.   

    你希望 saveDao1和 saveDao2一起成功的意思是
    如果saveDao2里出错,saveDao1也需要回滚(rollback)的意思吗?那么saveDao1和 saveDao2使用同一个connection,然后设connection#setAutoCommit(false)
    如果遇到意外,connection#rollback。 最后成功commit。不知道是不是你想要的答案。
    有不对的请指正,大家互相讨论进步哦~~ :)
      

  2.   

    感觉1楼差不多意思我不太明白楼主的意思&……
      

  3.   

    如何能控制使用到的是同一个Connection对象呢,我这有大概300多个更新和保存的方法,
    在业务层里,这些方法是N个组合一起执行的,当前使用的是Spring的事务管理保证数据的完整性,
    就是好奇它是怎么管理这些事务的。
      

  4.   

    这需要一个事物管理工具类, 启动事务、提交事务、关闭事务等方法
    在调用dao1 和 dao2之前在业务类中应该创建事务  事务将一个Transaction相关信息(数据库连接对象,事务次数,提交次数以及事务深度)放入到当 前线程的ThreadLocal对象中,本地线程保证事务的原子性。
    public UserTransaction getUserTransaction() throws NamingException {
    UserTransaction ut = utLocal.get();
    if (ut == null) {
    if (context == null) {
    context = new InitialContext();
    }
    ut = (UserTransaction) context.lookup(jndiName);
    utLocal.set(ut);
    } return ut;
    }获得事务: UserTransaction ut = transManager.getUserTransaction();
    ut.begin();
    在调用dao1传入参数事务变量,
    在调用dao2也传入参数事务变量,最后提交事务
    ut.commit();
    } catch (Exception e) {
    logger.error("Exception Occured when receiving Exchange Rate", e);

    ut.rollback();
    }
    这样应该肯定能够保证事务的正确性,不足之处就是要在需要在同一事务的方法参数中需要传入创建的事务参数。
      

  5.   

    批量处理的时候需要把自动提交设置为false hibernate的美咋研究过 
    hibernate很长时间没写了  也没打开ide 在这里给你写大概吧
    getConnection.setAutoCommit(false);要继承JdbcDaoSupport
    处理一个commit一次  这样在 catch里rollback()在finally再把自动提交设置为true
      

  6.   

    直接spring,把事物定义到每个service的每个方法就行了