简单分布式事务管理

人总是在鄙视中成长,学无止境,在分布式环境经常会遇到操作多个数据库的情况,这个具体取决于业务的分库设计,如果一个对外的接口同时要操作两个库的话,那么怎么保证一致性就是很大的问题,传统的基于JTA的全局事务管理,他们的事务管理基于XA协议,他们之间的事务感知基于数据库等支持XA协议的可管理器资源,这个方法当然是被鄙视的,呵呵,对于互联网来说JTA容器来说太重了,同时在性能上也不能满足,那么应该有一种更轻量级的方式去解决这个问题

    对于多个数据库操作,唯一要关心的是他们之间可以相互感知,也就是说第一个方法必须知道后续的事务方法的情况,根据后续事务的情况来考虑操作,比如可以写成

public class A {

   public void serviceA(){

       .....//A的业务方法

       B.serviceB();

      C.serviceC();

   }

}

这样做法的跨事务的方法加入到相同的帧栈上,然后通过异常来控制事务的提交或者回滚,只有一个帧栈的方法才能做到事务之间的感知,然后通过AOP去控制事务管理

  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable  

    {  

   

   //一个Map保存所有的连接

   Map dsMap = ThreadLocalHolder.getDsMap(); 

   

   //通过服务名字获取数据库连接

   Connection conn = dsMap.getConnection(proxy.getServiceName());

   

   conn.setAutoCommit(false);

        conn.begin();  

        //权限判断

        try {

    //方法通过A的属性类型得到数据库连接     

        Object result = method.invoke(targetObject, args);

        

        } catch(Exception ex) {

        conn.rollback();

        throw ex;

        }

        

        conn.commit();

          return result;

    }

 

把所有的事务代码通过在一个帧栈中感知事务,需要在应用端控制事务,而JTA把事务控制交给了JTA的事务管理器,而XA协议感知之间的成功,如果事务代码是平行的,那么应用端就搞不定.比如代码如下

public void facadeA(Request request) {

  A.serviceA();

  ....../////省略

  B.serviceB();

   C.serviceC();

}

这种不在一个帧栈的代码结构,只能通过JTA的方式去做了,希望这次鄙视可以让自己成长,无所谓失败还是成功,只想说,唉噢,不错噢!!Let us go ,tomorrow is another day..

 

 

 

 

 

 

 

猜你喜欢

转载自lishidi.iteye.com/blog/2212318