Hibernate Session 保存操作是不是与底层数据库事务同步?
Posted
技术标签:
【中文标题】Hibernate Session 保存操作是不是与底层数据库事务同步?【英文标题】:Does the Hibernate Session save operation synchronize with the underlying DB transaction?Hibernate Session 保存操作是否与底层数据库事务同步? 【发布时间】:2017-04-19 03:24:10 【问题描述】:在HIbernate commit() and flush() 看到这个例子
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
for ( int i=0; i<100000; i++ )
Customer customer = new Customer(.....);
session.save(customer);
if ( i % 20 == 0 ) //20, same as the JDBC batch size
//flush a batch of inserts and release memory:
session.flush();
session.clear();
tx.commit();
session.close();
我的理解是当我们执行 session.save(customer)
或 session.update(....)
时,hibernate 会将 DB 会话与 hibernate 同步?
它是否仅在提交/刷新/刷新时而不是在更新/保存时进行晒黑?
【问题讨论】:
【参考方案1】:Hibernate Session
和 JPA EntityManager
(也称为持久性上下文)充当 write-behind cache,因此 entity state transitions 在刷新期间被暂存并传播到数据库。
默认情况下,commit
调用会触发flush
,此时会执行 INSERT、UPDATE 和 DELETE 语句。
后写缓存的好处如下:
自动申请JDBC batch updates要容易得多 如果没有之前的 SELECT 语句,连接获取可以延迟到刷新,从而减少数据库连接租用时间。有关 Hibernate 工作原理的更多详细信息,请查看 this tutorial which features over 100 articles 了解 JPA、Hibernate 和最常见的 RDBMS。
【讨论】:
在我的测试用例中,当我执行session.save(customer) or session.update(....)
时,没有看到任何插入/更新查询被触发。它仅在提交或刷新时发生。所以你的声明and that's when INSERT, UPDATE, and DELETE statements are executed.
在这里似乎不正确?
您实际上是在确认我的说法。仔细阅读【参考方案2】:
Hibernate Session 的生命周期受逻辑事务的开始和结束的限制。 Session 为映射实体类的实例提供创建、读取和删除操作。 保存/更新/删除是事务操作。所以要执行这些操作,需要开始事务
session.beginTransaction();
然后只有我们可以执行保存/更新/删除。 Hibernate 提供了高质量的事务回滚机制。 Hibernate 仅在事务通过提交时才对数据库进行更改
session.getTransaction().commit();
直到提交被执行保存/更新/删除将与事务实例,一旦提交方法被调用休眠与数据库交互以应用更改。
如果保存/更新/删除失败,将执行回滚过程,保持数据库不变。
更多关于hibernate事务研究的信息https://www.javatpoint.com/hibernate-transaction-management-example
所以hibernate通过commit/flush/refresh同步DB session和hibernate session
【讨论】:
以上是关于Hibernate Session 保存操作是不是与底层数据库事务同步?的主要内容,如果未能解决你的问题,请参考以下文章