JPA EntityManager默认合并行为

时间:2013-02-23 17:51:14

标签: java jpa

我有两个使用相同库来处理数据库的应用程序。第一个应用程序是桌面,第二个是web。因此,它们都可以在我的数据库(PostgreSql)中同时更改相同的记录。该库使用此代码:

    //it doesnt use em.getTransaction()
em.merge(userAcc);//change useraccount

此代码是否会导致死锁?什么是合并的默认行为?合并中是否使用了交易? 实际上,两个合并操作的顺序无关紧要。

1 个答案:

答案 0 :(得分:1)

Java Persistence wikibook的相关引用。

  

从技术上讲,在JPA中,EntityManager从创建它的位置开始处于事务中。所以开始有点多余。在调用begin之前,无法调用某些操作,如persist,merge,remove。仍然可以执行查询,并且可以更改查询的对象,虽然这有点未指定JPA规范中的这些更改会发生什么,通常它们将被提交,但最好在对您进行任何更改之前调用begin对象。

因此,在这种情况下,merge()的行为似乎取决于您的持久性提供程序。

我猜这个实体无论如何都会在隐式事务中得到更新,但我认为这不会导致死锁。最糟糕的情况是,从两个应用程序对同一实体的并发更新将在不知情的情况下相互覆盖。您可以通过使用乐观锁定来防止这种情况。