本人也是新手。。为了实现双数据库事务全局事务添加回滚。。但是只用了一次。所以没用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 如果是的话
就在把状态改回去。。
其实整套思路。。。其实也比较不人性话。。。。但是也实现双数据的回滚。。。有更好的意见可以指点指点。。