日期:2014-05-19  浏览次数:20699 次

问个关于JAVA 事务的疑问,有信心解答的进
是这样的,通常大家都会在数据访问层做数据的持久化的工作,如下列方法

saveDao1();
saveDao2();

这两个方法分别将不同的信息保存在不同的数据表中,如果这时业务上有需求的话,我们会在业务层做逻辑处理,如下
public saveService(int i){

  if(i == 100){
  saveDao1();
  }else if(i == 200 ){
  saveDao2();
  }else{
  saveDao1();
  saveDao2();
  }
}

这时,如果传入的参数 i 不等与100,也不等于200 那么会执行到
  saveDao1();
  saveDao2();

此时,如何保证两个操作都成功呢? (注:这两个方法操作的是同一数据库)
希望大家给点思路,spring的管理事务就不要说了,这里不讨论框架,只讨论JDBC操作实现事务的方法。

------解决方案--------------------
这需要一个事物管理工具类, 启动事务、提交事务、关闭事务等方法
在调用dao1 和 dao2之前在业务类中应该创建事务 事务将一个Transaction相关信息(数据库连接对象,事务次数,提交次数以及事务深度)放入到当 前线程的ThreadLocal对象中,本地线程保证事务的原子性。
public UserTransaction getUserTransaction() throws NamingException {
UserTransaction ut = utLocal.get();
if (ut == null) {
if (context == null) {
context = new InitialContext();
}
ut = (UserTransaction) context.lookup(jndiName);
utLocal.set(ut);
}

return ut;
}

获得事务:

UserTransaction ut = transManager.getUserTransaction();
ut.begin();
在调用dao1传入参数事务变量,
在调用dao2也传入参数事务变量,

最后提交事务
ut.commit();
} catch (Exception e) {
logger.error("Exception Occured when receiving Exchange Rate", e);

ut.rollback();
}




这样应该肯定能够保证事务的正确性,不足之处就是要在需要在同一事务的方法参数中需要传入创建的事务参数。