Hibernate,如果不使用beginTransaction会发生什么?

时间:2017-06-29 10:31:03

标签: java sql hibernate session transactions

我使用hibernate 5.2连接到SQLite库。在我关闭Session之后,我创建了一个新的session.createNativeQuery("My sql").executeUpdate()并使用了Session。一切正常,但我遇到了几个例子,在创建Session后,他们开始Transaction,执行SQL操作,提交Transaction,然后关闭Session。但并非所有在线示例都包含Transaction,并且我的代码在没有它的情况下工作正常。

这让我很好奇:

  • 为什么我们需要使用Transaction
  • 如果我们赢了<?li>会怎样?
  • 最重要的是,在哪些情况下需要使用它 不?

我使用<property name="hibernate.connection.pool_size">1</property>

3 个答案:

答案 0 :(得分:0)

为什么我们需要使用交易? - &GT;你正在做的只是一个简单的更新,如果有多个更新,你需要事务管理mgmt,你想要事务的ACID性质。

如果我们赢了会怎么样? - &GT;如果有多个更新语句,并且其中一个引发异常,则会出现不一致的数据。

答案 1 :(得分:0)

您可以尝试将hibernate与JDBC相关联,然后您将获得有关事务的一些提示。

在JDBC中,您只需打开一个连接即可开始工作,最后您可以提交或回滚。

但是,如果您有许多不同的并行任务,这些任务可能相互依赖或相互独立。然后,您可能需要单独提交/回滚每个任务,或者如果任何失败则回滚。

for example
Big Task :
    small task1
    small task2
    small task3 and many more

如果任何小任务失败,则回滚大任务。这可能是众多业务需求之一。

在JDBC中,Connection接口提供了commit()和rollback()方法。

在jpa / hibernate中,Transaction接口提供了commit()和rollback()方法。

因此,一个会话可以有许多依赖或独立的事务。

以下是org.hibernate.Transaction

的文档
Allows the application to define units of work, while maintaining 
abstraction from the underlying transaction implementation (eg. JTA, JDBC). 

A transaction is associated with a Session and is usually 
initiated by a call to org.hibernate.Session.beginTransaction(). 
A single session might span multiple transactions since the notion of a session 
(a conversation between the application and the datastore) is of coarser granularity 
than the notion of a transaction. However, it is intended that there be at most 
one uncommitted transaction associated with a particular Session at any time. 

这也可能对你有所帮助 What is the difference between a session and a transaction in JPA 2.0?

答案 2 :(得分:0)

让我们定义什么是事务 - 基本上它是原子工作单元。

有两种类型的事务管理或事务划分(考虑到启动事务,提交或滚动事务的分界):CMT(容器管理的事务) - 由您的基础容器(JTA)和BMT(bean管理)管理事务划分 - 由开发人员自己以编程方式管理事务划分。因此,如果您在任何示例中看到transaction已获得并以编程方式提交或回滚 - 这是BMT的示例,那就是开发人员负责管理事务的时间。

每当您没有看到明确的事务划分时 - 这意味着它是CMT。 这是一个非常广泛的主题 - 我建议你read more.