ITEEDU

Hibernate Gossip: 简介事务管理(基于 JDBC )

事务是一组原子(Atomic)操作(一组SQL执行)的工作单元,这个工作单元中的所有原子操作在进行期间,与其它事务隔离,免于数据来源的交相更新而 发生混乱,事务中的所有原子操作,要嘛全部执行成功,要嘛全部失败(即使只有一个失败,所有的原子操作也要全部撤消)。

在JDBC中,可以用Connection来管理事务,可以将Connection的AutoCommit设定为false,在下达一连串的SQL语句后,自行呼叫Connection的commit()来送出变更,如果中间发生错误,则撤消所有的执行,例如:
try { 
          ..... 
          connection.setAutoCommit(false); 
          ..... 
          // 一连串SQL操作 
          connection.commit();
      } catch(Exception)
      { 
          // 发生错误,撤消所有变更 
          connection.rollback();
      }
Hibernate本身没有事务管理功能,它依赖于JDBC或JTA的事务管理功能,预设是使用JDBC事务管理,可以在配置文件中加上hibernate.transaction.factory_class属性来指定Transaction的工厂类别,例如:
hibernate.cfg.xml
<?xml version="1.0" encoding="utf-8"?> 
</hibernate-configuration>
基于JDBC的事务管理是最简单的方式,事实上,Hibernate基于JDBC的事务管理只是对JDBC作了个简单的封装:
try {
          session = sessionFactory.openSession();  
          Transaction tx = session.beginTransaction(); 
          ....
          tx.commit();  // 必须commit才会更新数据库
      } catch(HibernateException e) { 
          tx.rollback(); 
      }
在一开始的openSession()取得Session时,JDBC的Connection实例之AutoCommit就被设定为false,在 beginTransaction()时,会再度检查Connection实例的AutoCommit为false,在操作过程中,最后要commit (),否则的话对数据库的操作不会有作用,如果操作过程中因发生例外,则最后commit()不会被执行,之前的操作取消,执行rollback()可撤 消之前的操作,一个实际的程序如下所示:
FirstHibernate.java
package onlyfun.caterpillar;

import org.hibernate.HibernateException;
import org.hibernate.SessionFactory;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

public class FirstHibernate {

public static void main(String[] args) {
Configuration config = new Configuration().configure();
SessionFactory sessionFactory = config.buildSessionFactory();

User user = new User();
user.setName("momor");
user.setAge(new Integer(26));

Session session = null;
Transaction tx= null;

try {
session = sessionFactory.openSession();
tx = session.beginTransaction();
session.save(user);
tx.commit();
}
catch(Exception e) {
e.printStackTrace();
if(tx != null) {
try {
tx.rollback();
}
catch(HibernateException ee) {
ee.printStackTrace();
}
}
}
finally {
if(session != null) {
try {
session.close();
}
catch(HibernateException e) {
e.printStackTrace();
}
}
}

sessionFactory.close();
}
}
PS. 要使用MySQL中的事务处理,必须建立事务表类型的表格,例如InnoDB的表格:
CREATE TABLE user ( 
      ..... 
      ....