用的是JDBC,数据库oracle 9i,现在有数据库A,数据库B,数据库A有两个表A1,A2,数据库B有表B1,B2,A1和B1,A2和B2的结构都相同, 
其中A1和A2是主从表关系,B1和B2是主从表关系,现在的需求是要将A1,A2表中的数据复制到数据库B的B1表和B2表,考虑到事务的问题,我想如下设计,但 
感觉好象比较麻烦,看大家有无好的办法.注意,我没用触发器,用代码.   try 
  { 
    begin transcation 
      boolean b1=插入B1(); 
      boolean b2=插入B2(); 
    if b2=false then 回滚B1的事务; 
    if (b1=true) and (b2=true) 
    { 
      boolean b3=更新A1(); 
    if b3=false then 回滚b2,回滚B1 

}

解决方案 »

  1.   

    A1,A2表中的数据复制到数据库B的B1表和B2表
    这是一个事物把boolean a1;
    boolean a2;boolean flag = false;a1=A1复制到B1a2=A1复制到B1if(a1&&a2){
      flag = true;
    }if(flag){
     commit;
    }
    rollback;
      

  2.   

    楼主看样是对事物的有点迷糊,事物有个特性是不成功则全部操作回滚,如果某一步出错了,具体需要回滚哪些操作,哪些是做了的,哪些是没做的,统统不需要判断,只要一个rollback就可以
      

  3.   

    是A,B两个数据库哦,要用JTA吧?
      

  4.   

    问大家个问题,A,B两个数据库,A中有A2表,B中有B1,B2表,现在要把A2表中取出某个数据,B1表中取出某个数据,然后把两者插入B2表,写事务时用JDBC是这样,大家看下有无问题?
      try
    {
      connA.setautocommit(falase);//cona为A的数据库连接
      connB.setautocommit(falase);/connb为B的数据库连接
     //读取A2表中的数据的sql,如
        a2statement.execute(sql);
    //读取b1表的数据的sql,如
        b1statement.execute(sql);
    //插入b2表数据的sql
       conna.commit();
      connb.commit();
      conna.close();
     connb.close();
      conna.setautocomiit(true);
     connb.setauotocomiit(true);
    }
     catch { conna.rollback;connb.rollback}
      

  5.   

    这样我觉的不好 您要取A2表和B1表中的其中的数据现在conna.commit();
    connb.commit();
    conna.close();
    connb.close();就是A提交完了B提交 B提交完了A关闭B关闭 这种要有特殊情况下这个事务能行吗
      

  6.   

    建议采用Spring AOP声明性事物,对于这种问题迎刃而解
      

  7.   

    spring 声明事务管理对跨数据库的也不适合,JTA吧。。
      

  8.   

    用JTA吧,这个应该能够处理。如果是偶尔一次的操作,建议使用工具软件。
    用JDBC,可能会比较复杂。
    主从关系,不知道是一对一还是一对多,如果一对多在复制的时候,可能会出现问题。
    如果是一对一的话,可以根据主键的值进行批量的复制(就是说,一次事物提交500个左右的记录操作)。
    如果是一对多的话,一条A表记录,可能会对应多条B记录,那么,复制过程中,注意查询语句的结果内容。
    如果一对多复制的速度太慢,建议调整数据库的隔离级别后,采用多线程(3~5个线程即可)来并发操作。
      

  9.   

    2个数据库操作,需要用JTA来保持事务的完整性
      

  10.   

    例子楼主去网上找一下吧,tomcat不支持JTA
    如果是weblogic等服务器,最好在weblogic上配置xa的数据源
    UserTransaction tx = (UserTransaction)ctx.lookup("javax.transaction.UserTransaction");
    tx.begin();
    ds1 = (javax.sql.DataSource)ctx.lookup("ds1");
    ds2 = (javax.sql.DataSource)ctx.lookup("ds2");
    ds3 = (javax.sql.DataSource)ctx.lookup("ds3");
    //获取connnection并进行各种事务操作,但不要声明事务,也不要写提交还是回滚
    tx.commit();异常中写tx.rollback();
    finally中写各种close