用的是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
}
}
其中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
}
}
这是一个事物把boolean a1;
boolean a2;boolean flag = false;a1=A1复制到B1a2=A1复制到B1if(a1&&a2){
flag = true;
}if(flag){
commit;
}
rollback;
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}
connb.commit();
conna.close();
connb.close();就是A提交完了B提交 B提交完了A关闭B关闭 这种要有特殊情况下这个事务能行吗
用JDBC,可能会比较复杂。
主从关系,不知道是一对一还是一对多,如果一对多在复制的时候,可能会出现问题。
如果是一对一的话,可以根据主键的值进行批量的复制(就是说,一次事物提交500个左右的记录操作)。
如果是一对多的话,一条A表记录,可能会对应多条B记录,那么,复制过程中,注意查询语句的结果内容。
如果一对多复制的速度太慢,建议调整数据库的隔离级别后,采用多线程(3~5个线程即可)来并发操作。
如果是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