我有两个应用程序使用同一个库来处理数据库。第一个应用程序是桌面应用程序,第二个应用程序是 Web。所以他们都可以在我的数据库(PostgreSql)中同时更改相同的记录。该库使用以下代码:
//it doesnt use em.getTransaction()
em.merge(userAcc);//change useraccount
这段代码会导致死锁吗?合并的默认行为是什么?合并是否使用内部事务?实际上,两个合并操作的顺序无关紧要。
Java Persistence wikibook中的相关引用。
从技术上讲,在 JPA 中,EntityManager 从创建之日起就处于事务中。所以 begin 有点多余。在调用 begin 之前,不能调用某些操作,例如persist、merge、remove。仍然可以执行查询,并且可以更改被查询的对象,尽管在 JPA 规范中这些更改会发生什么情况有些不确定,通常它们会被提交,但是最好在对您的任何更改之前调用 begin对象。
因此,在这种情况下,似乎 的行为merge()
将取决于您的持久性提供者。
我想实体无论如何都会在隐式事务中更新,但我认为这不会导致死锁。最坏的情况是两个应用程序对同一实体的并发更新将在不知情的情况下相互覆盖。您可以通过使用乐观锁定来防止这种情况。