bos*_*man 6 java database concurrency jpa transactions
我已阅读有关事务隔离级别的信息.它用于防止并行事务执行错误.很明显.还有可用于实体的锁定模式.我明白他们是如何工作的.
但是我找不到需要锁定的原因?我已经使用了事务隔离级别.为什么我必须使用锁定?隔离级别和锁定是否做同样的工作?
事务隔离和JPA实体锁定都是并发控制机制.
该事务隔离被应用在一个JDBC Connection水平和范围是事务生命周期本身(你不能改变从当前运行的事务的事务隔离).现代数据库允许您使用2PL(两阶段锁定)隔离级别和MVCC隔离级别(SNAPSHOT_ISOLATION或PostgreSQL隔离级别).在MVCC中,读者不会阻止编写者和编写者不阻止读者(只有编写者阻止编写者).
在Java持久性API锁既提供数据库级和应用级的并发控制,它可以在两个类别进行分割:
乐观锁使用UPDATE/DELETE语句中的版本检查,并在版本不匹配时失败.
显式悲观锁定模式:
悲观锁定模式使用特定于数据库的锁定语法来获取读取(共享)或写入(独占)锁定(例如,SELECT ... FOR UPDATE).
一个明确的锁定模式,当你在一个较低的一致性隔离级别(READ_COMMITTED)上运行,并且希望获取锁,其范围是适用于从查询终身升级到一个事务的生命时间.
介绍
有不同的锁定类型和隔离级别.一些锁定类型(OPTIMISTIC*)在JPA级别上实现(例如在EclipseLink或Hibernate中),而其他(PESSIMISTIC*)由JPA提供者委托给DB级别.
说明
隔离级别和锁定不一样,但它们可能会在某处交叉.如果你有SERIALIZED隔离级别(性能贪婪),那么你在JPA中不需要任何锁定,因为它已经由DB完成了.另一方面,如果您选择READ_COMMITTED,那么您可能需要进行一些锁定,因为单独的隔离级别不能保证您的条目不会同时被另一个事务更改.