Hibernate 对事务的支持

我们这里只讨论Hibernate 对事务的支持,注意没有涉及到Spring 跟Hibernate 集成这个问题将放到以后再讨论。

在Hibernate 里面也定义了一个接口 Transaction public void begin() throws HibernateException;

public interface Transaction {	
	public void begin() throws HibernateException;
	public void commit() throws HibernateException;
	public void rollback() throws HibernateException;
	public boolean wasRolledBack() throws HibernateException;
	public boolean wasCommitted() throws HibernateException;
	public boolean isActive() throws HibernateException;
	public void registerSynchronization(Synchronization synchronization) 
	public void setTimeout(int seconds);
}

 
这里面最重要的有 begin, commit and rollback 几个方法。

有聊这个接口Hibernate 对事务应用的最常见idiom 是 :

Session sess = factory.openSession();
   Transaction tx;
   try {
       tx = sess.beginTransaction();
       //do some work
       ...
       tx.commit();
   }
   catch (Exception e) {
       if (tx!=null) tx.rollback();
       throw e;
   }
   finally {
       sess.close();
   }
 
这个Session 的实现类是SessionImpl, 在SessionImpl.beginTransaction() 方法中
几个的思路就是根据 configruation 信息 获取到Transaction, 然后调用transaction.begin() 方法。


Hibernate 里面的Transaction 有两个最常见的实现JTATransaction,  JDBCTransaction。 根据配置信息的不一样, beginTransaction得到就是这两个类得不同实例。   在实现这两个类得时候, Hibernate 还有个这个Session需要处理。 这个Session里面managed bean 需要flush, 通常在 这个 commit 方法要先调用 manageFlush 来强制cache 中的状态同步到数据库。


JTATransaction 实现的思路 技术上是begin() 的时候 通过jndi 找到 UserTransaction, 这个UserTransaction 开始就意味着global transaction 开始了。 同时利用JTA 事务的Syncronization 机制注册个 CacheSynchronization。 这个 CacheSynchronization 会在 JTA 事务 开始提交前 和提交后 分别 flush 和 close

JTATransaction  的 commit 方法 差不多是  先 managedFlush , 然后 UserTransaction.commit


JDBCTransaction 的事务的思路呢 begin 时 得到 那个jdbc connection, 修改它的 AutoCommit 成 false 就意味着 jdbc 事务开始了.

commit 的时候呢 同样也要先 Session flush, 然后找到那个 connection 去 commit(),  完了如果有必要恢复 AutoCommit 成 true 的话就 reset 回去。 


这里只是简单介绍Hibernate 对事务的处理, 至于Spring 对事务的处理在以后的文章中会提到。 

猜你喜欢

转载自bruce008.iteye.com/blog/1473375