JPA锁和数据库隔离级别

时间:2014-02-21 17:03:36

标签: jpa

JPA锁定(乐观/悲观)和数据库隔离级别(例如http://www.postgresql.org/docs/9.1/static/transaction-iso.html)之间是否存在相互影响?

EJB3.2规范(8.3.2“隔离级别”)说Bean Provider负责设置事务的隔离级别,所以一般我不在乎,但无论如何我仍然感到困惑。在PostgreSQL中的示例中,根据提到的源,默认隔离级别是“读取提交”。这是否意味着,当我不锁定任何实体时,事务隔离级别仍将“读取提交”?

1 个答案:

答案 0 :(得分:1)

通过在您的实体上使用@Version列并且不使用锁定(相当于使用LockModeType.NONE),您隐式使用READ_COMMITED隔离。这是在JPA层中实现的,因为所有更新通常都会延迟到提交时间或者抛出OptimisticLockException是更新冲突的情况(我仍假设没有显式锁定)。

  

它假定...写入数据库   通常只有在调用flush方法时才会发生 - 无论应用程序是否显式,   或者由持久性提供程序运行时根据刷新模式设置

在数据库层,JPA规范还假设您具有READ_COMMITED隔离。

  

它假定数据库为   使用读提交隔离的实现将访问哪些持久性单元被映射   (或未持有长期读锁的供应商)

当然,手动刷新/刷新,查询和刷新类型模式(AUTOCOMMIT)使情况复杂化。第二级和查询缓存配置也可能起作用。但是,对于所有默认值,JPA READ_COMMITED表现得非常可预测,并且根据经验,在数据库级别上使用READ_COMMITED隔离是安全的。

为了使用JPA实现REPETABLE_READ,你必须使用锁(但这是另一个故事)。

  

锁定模式旨在提供一种能够实现“可重复读取”语义效果的工具