在一个方法中同时使用了两种事务,
一个是Hibernate的事务,另一个是jdbc的事务,
请教各位,如何确保其中一个事务提交失败时,另一个事务必需回滚。
例如,jdbc事务提交成功,但hibernate事务提交失败,怎样才能让jdbc事务回滚?或者有什么更好的方式解决这种问题。部分代码:public boolean doAudit() throws Exception {
Session sess = null;
Transaction tx = null;
Connection con = null;
try {
//Hibernate 事务
sess = HibernateCfg.openClearedSession();
tx = HibernateCfg.beginTransaction(sess);
//jdbc事务
con = DBTools.getConnection();
DBTools.beginTransaction(con);
onAudit(sess, con);
DBTools.commit(con);
HibernateCfg.commit(tx);
return true;
} catch (Exception e) {
DBTools.rollback(con);
HibernateCfg.rollBack(tx);
} finally {
DBTools.release(con);
}
return false;
}
一个是Hibernate的事务,另一个是jdbc的事务,
请教各位,如何确保其中一个事务提交失败时,另一个事务必需回滚。
例如,jdbc事务提交成功,但hibernate事务提交失败,怎样才能让jdbc事务回滚?或者有什么更好的方式解决这种问题。部分代码:public boolean doAudit() throws Exception {
Session sess = null;
Transaction tx = null;
Connection con = null;
try {
//Hibernate 事务
sess = HibernateCfg.openClearedSession();
tx = HibernateCfg.beginTransaction(sess);
//jdbc事务
con = DBTools.getConnection();
DBTools.beginTransaction(con);
onAudit(sess, con);
DBTools.commit(con);
HibernateCfg.commit(tx);
return true;
} catch (Exception e) {
DBTools.rollback(con);
HibernateCfg.rollBack(tx);
} finally {
DBTools.release(con);
}
return false;
}
如果是同一个connection 既你的jdbc connection是session 获取的的con,那么你可以在jdbc 操作出现需要回滚的情况下,设置session的是否回滚的状态。 这种情况不属于事物欠套问题。 如果他们获取的 connection 并不是同一个,举个例子,如果你使用spring来配置方法的事物,并设置了事物隔离级别和传播行为(解决事物欠套问题),这个时候如果是 具备事物功能的方法A调用了 同样具备事物功能的方法B,这个时候配置的事物传播行为开始起作用。 详细你可以参考这篇文章,是事物隔离级别和传播行为写的比较清晰的一篇。
http://www.javaeye.com/topic/78674 里面有伪代码,非常不错。 楼主仔细看下。
即: AOP
interceptor before
//hibernate事务开启,session 资源绑定ThreadLocal hibernate_local
//jdbc事务开启, connection 资源绑定ThreadLocal jdbc_local
target
//hibernate业务处理,保存状态(是否提交或回滚)
//jdbc业务处理,保存状态(是否提交或回滚)
interceptor after
//hibernate 根据状态,判断是否需要提交或者回滚
//jdbc 根据状态,判断是否需要提交或者回滚楼主不好意思啊。
现在直接通过用户去访问另一个数据库就可以了。
如:update est.ch_room set roomlabel ....我的这个问题可能和你所说的有所出入。
现在接触symfoware,怀恋oracle啊。