在JPA中,交易开始时有多重要?
JPA事务提交应该保存到目前为止对与持久性上下文关联的实体所做的所有更改。因此,在JPA中,交易开始时有多重要?,jpa,transactions,Jpa,Transactions,JPA事务提交应该保存到目前为止对与持久性上下文关联的实体所做的所有更改。因此,commit()的位置非常重要。begin()在哪里有多重要?考虑下面两个场景,这两个场景都创建实体 x>代码>,关联一个持久性上下文的代码 x>代码>,然后修改该实体,并将更改保存到 x>代码>到数据库: // Scenario A EntityManager em = ... MyEntity x = new MyEntity(); em.getTransaction().begin(); em.persist(
commit()
的位置非常重要。begin()
在哪里有多重要?考虑下面两个场景,这两个场景都创建实体<代码> x>代码>,关联一个持久性上下文的代码<代码> x>代码>,然后修改该实体,并将更改保存到<代码> x>代码>到数据库:
// Scenario A
EntityManager em = ...
MyEntity x = new MyEntity();
em.getTransaction().begin();
em.persist(x);
em.getTransaction().commit();
// ... do some stuff ...
x.a = val1;
x.setB(val2);
em.getTransaction().begin(); // *a "late begin"*
em.getTransaction().commit();
vs
在这两种情况下,对象x
都属于EntityManager em
的持久化上下文。
在这两种情况下,第二次commit
将保存自第一次提交以来对em
上下文的所有更改,包括对x.a
和x.b
的更改,不是吗
在这种情况下,两种场景之间的功能区别是什么
假设我们没有使用Spring、JavaBean和其他高级技术;只有Java持久性API和OpenJPA实现。p.S.让我们假设flushMode=AUTO,因此不需要显式的flush()。只要您不发出查询(直接或其他方式),就没有多大区别。在这两种情况下,发出查询可能具有不同的语义,因为根据事务隔离级别,在“早期”情况下,可能会对选定数据获取锁。当然,一些操作,如试图获取悲观锁,将在事务之外完全失败
// Scenario B
EntityManager em = ...
MyEntity x = new MyEntity();
em.getTransaction().begin();
em.persist(x);
em.getTransaction().commit();
// ... do some stuff ...
em.getTransaction().begin(); // *an "early begin"*
x.a = val1;
x.setB(val2);
em.getTransaction().commit();