spring+hibernate 手动进行双数据库分布式事务控制

本人也是新手。。为了实现双数据库事务全局事务添加回滚。。但是只用了一次。所以没用aomikos 第三方分布式事务

  所以拿出来跟大家分享一下 。。。。。。请各位高手提提意见。。。。指点指点

 

 

主要的就是实现A数据库对B 数据库 数据复制。如果复制成功  B 的状态开下

如果在改状态的时候出错B  把A的数据库回滚 。主要是实现这种功能

 

配置的话。。就像以前配置ssh集成一个。以前就用一个sessionFacory 现在咋们配两个其他都相同 。只要还是在代码那控制。

 

 

 Session session1=null;
 Session session2=null;
 Transaction tx1=null;
 Transaction tx2=null;

try

{

   //开启第一个session工厂

    session1=stockDao.getHibernateTemplate().getSessionFactory().openSession();

   //打开第一个事务

   session1.beginTransaction();

 

 

  //开启第二个session工厂

   session2=taskDao.getHibernateTemplate().getSessionFactory().openSession();

  //打开第二个事务
    tx2=session2.beginTransaction();

  

    ........//这里就是做一些业务的操作保存

 

    //最后保存第一个事务

   session1.persist(test1);   //用persist 是不马上保存到数据库去。

 

  //test2.setStatus("10");  //页面操作改变状态

 

  //修改test2 (注意必须要用 merge ) 

   session2.merge(test2);

 

  //先提交第一个数据  

  tx2.commit();

  //在提交第二个数据
  tx1.commit();

 

 

  //这里有个判断  说明第一个保存成功就i=1

if(taskBase.getId()!=null)
   {
    i=1;
   }
   i=1;

 

}

//如果有一个出错

catch(Exception e)

{

   e.printStackTrace();

   //如果状态被修改为10
    if(test2.getStatus().equals("10"))
    {

  //那么就从新获得事务。。因为在出错的时候就已经自动的关闭事务了 。所以要在开启。
     session2=stockDao.getHibernateTemplate().getSessionFactory().openSession();

// 开启事务
     tx2=session2.beginTransaction();
     tx2.begin();

//把状态给改回去
     stock.setStatus("9");

//然后再修改
     session2.merge(stock);

//提交
     tx2.commit();

//关闭session工厂
     stockDao.getHibernateTemplate().getSessionFactory().close();
     i=-1;
    }

//事务回滚
    tx1.rollback();
    tx2.rollback();

 

}

 

 

整体思路详解 :

     首先先说

      第一:tx2.commit  说明当B状态改为10的时候报错的话 。。他就不保存A 的数据 因为设置session1为persist

      第二:B 状态 修改成功了之后  说明数据库已经改了。。但是A 数据出错

      当在抛异常的时候说明

        判断if(test2.getStatus().equals("10"))  是否为10 如果是的话

        就在把状态改回去。。

 

其实整套思路。。。其实也比较不人性话。。。。但是也实现双数据的回滚。。。有更好的意见可以指点指点。。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值