JPA EntityManager默认合并行为



我有两个应用程序使用同一个库来处理数据库。第一个应用程序是桌面应用程序,第二个是网络应用程序。所以他们两个可以同时更改我的数据库(PostgreSql)中的同一条记录。图书馆使用这个代码:

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

此代码会导致死锁吗?合并的默认行为是什么?合并是否使用内部事务?实际上,两个合并操作的顺序并不重要。

Java Persistence Wiki中的相关引用。

从技术上讲,在JPA中,EntityManager从创建时起就处于事务中。所以begin有些多余。在调用begin之前,无法调用诸如persistent、merge、remove等特定操作。查询仍然可以执行,查询的对象也可以更改,尽管JPA规范中的这些更改在某种程度上没有指定会发生什么,通常会提交这些更改,但最好在对对象进行任何更改之前调用begin。

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

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