2013-02-23 56 views
0

我有两个应用程序使用相同的库来处理数据库。第一个应用程序是桌面,第二个应用程序是web。所以他们都可以在我的数据库(PostgreSql)中同时更改相同的记录。库使用此代码:JPA EntityManager默认合并行为

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

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

回答

1

Java Persistence wikibook的相关报价。

从技术角度讲,在JPA中,EntityManager从创建点开始处于事务中。所以开始有点多余。在开始被调用之前,某些操作(如persist,merge,remove)不能被调用。查询仍然可以执行,并且查询的对象可以更改,虽然这有点不明确,但JPA规范中的这些更改会发生什么,通常它们会被提交,但最好在对您的任何更改做出更改之前调用begin对象。

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

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

+0

因此,如果它使用当前隔离级别内的事务。 – bossman 2013-02-23 18:40:11

+0

JPA规范没有定义默认隔离级别。它将由底层数据库和持久性提供者决定。 – zagyi 2013-02-23 18:52:02