技术开发 频道

如何使用Hibernate来管理事务


    如果事务中只有一个操作,那么事务是否提交,只依赖于这个操作的成功或失败。如一条INSERT语句,只有在这条语句成功执行后,数据才被真正写到数据库中。

    现在让我们来看看事务中包含多条CRUD语句的情况,如包含一条UPDATE语句和二条DELETE语句。在这种情况下,不管这三条语句哪一条执行失败,整个事务都将回滚。

    在使用事务时为了不产生负面影响,常常要对事务进行划分,即将一个大的事务合理划分成一些小的事务。这样如果某一个事务回滚的话,就不用回滚所有操作了。至于将大事务划分成多少个小的事务,这就要根据具体的情况而定。

    现在让我们来看看JDBC事务。对于数据库事务而言,操作事务的语言一般是SQL。而在编程环境中,事务要分为两种类型,非管制事务和管制事务。对于非管制事务,我们需要直接使用JDBC API来操作。我们可以使用三个JDBC方法来操作事务,它们是setAutoCommit(false)、commit()和rollback()。使用方法如下面的代码所示:

1Try 2{ 3conn.setAutoCommit(false); // 参数要使用false,否则将自动提交 4// 连接和操作数据库 5conn.commit(); 6} 7catch(Exception e) 8{ 9conn.rollback(); 10} 11
    为了使Hibernate更有吸引力,Hibernate为我们提供了会话,一个会话可以包含一个或多个事务。而Hibernate提供了很多处理会话和事务的API。这些API可以使我们更方便地处理事务,这就是我们下一部分要讨论的:用于管理事务的核心API。

管理事务的核心API

    在Hibernate中,事务的核心是事务接口。实现这些接口的类负责处理相关的工作,如通讯、在数据库或JTA层的事务管理。一个事务对象总是被包含在会话对象中。我们可以通过会话对象中的beginTransaction()来实例化一个事务对象。如下如示:

    Transaction transaction = session.beginTransaction(); // 实例化一个事务对象

    上面的语句将实例化一个叫transaction的事务对象。在Hibernate中提供了三种事务,如下如示:

    1. JDBC事务

    2. JTA事务

    3. CMT事务

     在这三种事务中,JDBC事务是默认的。这就意味着如果未设置hibernate.properties文件中的hibernate.transaction_factory的键值,beginTransaction将返回一个JDBC事务。

    虽然一个会话中可以包含多个事务,但并不需要人为地对这些事务进行分割,而是由会话中的一些方法对多个事务进行管理的。下面将详细描述这些方法:
commit()方法是结束事务的两个方法之一。在这方法在内部调用了会话对象的save()方法。当调用这个方法时,如果这个事务已经被初始化,那么这个事务将成功提交。

    rollback()方法从它的名字可以看出,这个方法将事务恢复到执行前的状态。初始化一个事务和提交或回滚事务的代码如下:
try { Transaction transaction = session.beginTransaction(); // 对数据库进行CRUD 操作 transaction.commit(); // 提交事务 } catch(Exception e) { transaction.rollback(); // 回滚事务 }
     上述的几个方法是Hibernate处理事务的核心方法。在下一部分我们将实现一个工厂类,这个类封装了Hibernate用于管理事务的功能,从而使代码得到重用。
0
相关文章