4.1 Hibernate 中的事务介绍
对于以上所有内容,我想添加有关交易的信息。如您所知,事务是一组必须一起执行的操作。如果任何操作失败或执行出错,则必须取消所有其他操作。

Hibernate 能够处理两种类型的事务:
- JDBC
- JTA
JDBC 事务实际上是数据库事务。它与使用数据库、JDBC 连接相关联。并且他确保使用数据库时的操作按应有的方式执行:要么全部执行,要么什么都不执行。
JTA - 事务是应用程序级别的事务。它不绑定到任何数据库。它的任务是确保执行某些操作:全部或不执行。
例如,您可以在单个 JTA 事务中将数据写入多个不同的数据库。然后如果发生错误,那么 JTA 事务将不得不回滚所有数据库中的更改。即使是那些在特定数据库方面成功执行的。
4.2 Hibernate 事务接口
在 Hibernate 库中,事务由 Transaction 接口表示,它可以有不同的实现。例如,在与 Spring 合作时,Spring 提供了自己的 JTA 事务机制。
该接口的方法有:
# | 方法 | 描述 |
---|---|---|
1个 | 开始() | 开始新的交易 |
2个 | 犯罪() | 结束事务,推送/提交所有更改 |
3个 | 回滚() | 回滚当前事务 |
4个 | 设置超时(整数秒) | 设置最大事务执行时间 |
5个 | 活跃() | 检查事务是否处于活动状态 |
6个 | 被回滚() | 检查事务是否正常回滚 |
7 | 已提交() | 检查事务是否正常提交 |
8个 | 注册同步() | 注册一个回调来控制事务 |
重要的!创建事务对象和启动事务是两件不同的事情。这里可以类比Thread类。当您创建 Thread() 对象时,JVM 尚未启动新线程。要启动它,您需要调用 Thread 对象的 start() 方法。事务也是如此——它需要调用 begin() 方法。
Hibernate 通常如何处理事务的示例:
Session session = sessionFactory.openSession();
Transaction transaction = session.getTransaction();
try {
transaction.begin();
Long count = session.createQuery("select count(*) from Employee", Long.class).uniqueResult();
transaction.commit();
}
catch (Exception e) {
if (transaction.getStatus() == ACTIVE || transaction.getStatus() == MARKED_ROLLBACK) {
transaction.rollback();
}
}
finally {
session.close();
sessionFactory.close();
}
我们在这里看到三件事:
首先,所有与数据库的工作都通过调用方法包装在一个事务中begin()
,并且commit()
必须执行调用这两个方法之间的所有操作:要么一起执行,要么什么都不执行。
其次,如果发生任何错误,我们会尝试回滚事务——调用rollback()
. begin()
这意味着 TransactionManger 必须首先记录和之间的所有操作commit()
,然后返回调用 时的所有内容rollback()
。
顺便说一句,调用回滚方法不会出错也不是事实。错误总是会发生。您只需要接受这个事实并为此做好准备。
4.3 事务管理器
从事务管理的角度来看,Hibernate 只是 JDBC 的轻量级对象包装器。Hibernate 本身没有事务处理特性。Hibernate Transaction 实际上是底层 JDBC 事务的包装器(或 JTA 事务包装器)。JDBCTransaction 是默认值。Hiberante 设置文件中的示例:
hibernate.transaction.factory_class org.hibernate.transaction.JTATransactionFactory
hibernate.transaction.factory_class org.hibernate.transaction.JDBCTransactionFactory
让我们再看看我们使用事务的代码:
Session session = sessionFactory.openSession();
Transaction transaction = session.getTransaction();
transaction.begin();
//here is your code for working with the base
session.flush();
transaction.commit();
session.close();
现在让我们看一下 JDBCTransaction 类代码:
public class JDBCTransaction implements Transaction {
public void begin() throws HibernateException {
...
if (toggleAutoCommit) jdbcContext.connection().setAutoCommit(false);
...
}
}
这是启动事务的方法。然后看send方法:
public void commit() throws HibernateException {
...
jdbcContext.connection().commit();
...
jdbcContext.connection().setAutoCommit( true );
...
}
现在让我们将此代码替换为 Hibernate 示例代码:
休眠 | 简单的 JDBC 代码 |
---|---|
|
|
所以本机 Hibernate 事务只是对数据库的本机 JDBC 调用。仅此而已。但 JTA 事务更有趣。但下次再谈。
GO TO FULL VERSION