JPA锁定(乐观/悲观)和数据库隔离级别(例如http://www.postgresql.org/docs/9.1/static/transaction-iso.html)之间是否存在相互影响?
EJB3.2规范(8.3.2“隔离级别”)说Bean Provider负责设置事务的隔离级别,所以一般我不在乎,但无论如何我仍然感到困惑。在PostgreSQL中的示例中,根据提到的源,默认隔离级别是“读取提交”。这是否意味着,当我不锁定任何实体时,事务隔离级别仍将“读取提交”?
答案 0 :(得分:1)
通过在您的实体上使用@Version
列并且不使用锁定(相当于使用LockModeType.NONE
),您隐式使用READ_COMMITED隔离。这是在JPA层中实现的,因为所有更新通常都会延迟到提交时间或者抛出OptimisticLockException
是更新冲突的情况(我仍假设没有显式锁定)。
它假定...写入数据库 通常只有在调用flush方法时才会发生 - 无论应用程序是否显式, 或者由持久性提供程序运行时根据刷新模式设置
在数据库层,JPA规范还假设您具有READ_COMMITED隔离。
它假定数据库为 使用读提交隔离的实现将访问哪些持久性单元被映射 (或未持有长期读锁的供应商)
当然,手动刷新/刷新,查询和刷新类型模式(AUTO
,COMMIT
)使情况复杂化。第二级和查询缓存配置也可能起作用。但是,对于所有默认值,JPA READ_COMMITED表现得非常可预测,并且根据经验,在数据库级别上使用READ_COMMITED隔离是安全的。
为了使用JPA实现REPETABLE_READ,你必须使用锁(但这是另一个故事)。
锁定模式旨在提供一种能够实现“可重复读取”语义效果的工具