我使用hibernate 5.2连接到SQLite
库。在我关闭Session
之后,我创建了一个新的session.createNativeQuery("My sql").executeUpdate()
并使用了Session
。一切正常,但我遇到了几个例子,在创建Session
后,他们开始Transaction
,执行SQL
操作,提交Transaction
,然后关闭Session
。但并非所有在线示例都包含Transaction
,并且我的代码在没有它的情况下工作正常。
这让我很好奇:
Transaction
?我使用<property name="hibernate.connection.pool_size">1</property>
答案 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.