交易

可用

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 代码

Session session = sessionFactory.openSession();
Transaction transaction = session.getTransaction();
transaction.begin();
//here is your code for working with the database
session.flush();
transaction.commit();
session.close();

Connection conn = jdbcContext.connection();
conn.setAutoCommit(false);
 
//here is your database code
conn.commit ()
conn.setAutoCommit(true);
conn.close();

所以本机 Hibernate 事务只是对数据库的本机 JDBC 调用。仅此而已。但 JTA 事务更有趣。但下次再谈。

评论
  • 受欢迎
你必须先登录才能发表评论
此页面还没有任何评论