人总是在鄙视中成长,学无止境,在分布式环境经常会遇到操作多个数据库的情况,这个具体取决于业务的分库设计,如果一个对外的接口同时要操作两个库的话,那么怎么保证一致性就是很大的问题,传统的基于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..