向总部建设网站申请书,怎么建投票网站,学电脑培训班,专科网页设计实训报告java持久性与安全性隐式锁定 在并发理论中#xff0c;锁定用于保护可变共享数据免受危险数据完整性异常的影响。 因为锁管理是一个非常复杂的问题#xff0c;所以大多数应用程序都依赖于其数据提供程序隐式锁技术。 将整个锁定职责委托给数据库系统既可以简化应用程序开发锁定用于保护可变共享数据免受危险数据完整性异常的影响。 因为锁管理是一个非常复杂的问题所以大多数应用程序都依赖于其数据提供程序隐式锁技术。 将整个锁定职责委托给数据库系统既可以简化应用程序开发又可以防止诸如死锁之类的并发问题。 死锁仍然可能发生但是数据库可以检测并采取安全措施任意释放两个竞争锁之一。 物理锁 大多数数据库系统使用共享读取和排他写入锁这归因于特定的锁定元素行表。 尽管SQL标准要求物理锁定但是悲观的方法可能会阻碍可伸缩性。 现代数据库已实现了轻量级锁定技术例如多版本并发控制 。 隐式数据库锁定隐藏在事务隔离级别配置的后面。 每个隔离级别都带有预定义的锁定方案旨在防止某些数据完整性异常集。 READ COMMITTED对当前事务修改的数据使用查询级共享锁和排他锁。 REPEATABLE READ和SERIALIZABLE在读取时使用事务级共享锁在写入时使用互斥锁。 逻辑锁 如果数据库锁定足以用于批处理系统则多请求Web流将跨越多个数据库事务。 对于长时间的对话 逻辑乐观锁定机制更为合适。 与对话级别的可重复读取存储结合使用 乐观锁定可以确保数据完整性而无需牺牲可伸缩性。 JPA支持开放式锁定和持久性上下文可重复读取使其非常适合实现逻辑事务。 显式锁定 虽然对于大多数应用程序并发控制要求隐式锁定可能是最佳选择但有时您可能需要更细粒度的锁定策略。 大多数数据库系统都支持查询时排他锁定指令例如SELECT FOR UPDATE或SELECT FOR SHARE 。 因此我们可以使用较低级别的默认隔离级别READ COMMITTED同时为特定事务方案请求共享或排他锁。 大多数乐观锁定实现只验证修改后的数据但是JPA也允许显式乐观锁定。 JPA锁定 作为数据库抽象层JPA可以从基础RDBMS提供的隐式锁定机制中受益。 对于逻辑锁定JPA还提供了可选的自动实体版本控制机制。 JPA支持以下操作的显式锁定 寻找一个实体 锁定现有的持久性上下文实体 刷新实体 查询通过JPQL标准或本机查询 显式锁类型 LockModeType包含以下乐观和悲观锁定模式 锁定模式类型 描述 没有 在没有显式锁定的情况下应用程序将使用隐式锁定乐观或悲观 乐观的 始终在事务提交时发出版本检查因此确保乐观锁定可重复读取。 读 与OPTIMISTIC相同。 OPTIMISTIC_FORCE_INCREMENT 始终增加实体版本即使实体不变并在事务提交时发出版本检查从而确保乐观锁定可重复读取。 写 与OPTIMISTIC_FORCE_INCREMENT相同。 PESSIMISTIC_READ 获取共享锁以防止任何其他事务获取PESSIMISTIC_WRITE锁。 PESSIMISTIC_WRITE 获取排他锁以防止任何其他事务获取PESSIMISTIC_READ或PESSIMISTIC_WRITE锁。 PESSIMISTIC_FORCE_INCREMENT 获取数据库锁以防止任何其他事务获取PESSIMISTIC_READ或PESSIMISTIC_WRITE锁并且在提交事务时会增加实体版本。 锁定范围和超时 JPA 2.0定义了javax.persistence.lock.scope属性采用以下值之一 NORMAL由于对象图可以跨越多个表因此显式的锁定请求可能会传播到多个表例如联接继承辅助表。由于整个实体关联的行都被锁定因此多对一和一对-一对一的外键也将被锁定但不会锁定另一侧父级关联。 此范围不会传播到子级集合。 扩展显式锁将传播到元素集合和联结表 但不会锁定实际的子实体。 该锁仅在防止幻像读取或更改实际的子实体状态的同时用于防止删除现有的子实体。 JPA 2.0还引入了javax.persistence.lock.timeout属性使我们能够配置锁定请求在引发PessimisticLockException之前将等待的时间毫秒。 Hibernate锁定 Hibernate支持所有JPA锁定模式和一些其他特定的锁定选项。 与JPA一样可以为以下操作配置显式锁定 使用各种LockOptions设置锁定实体。 得到一个实体 加载实体 刷新实体 创建实体或本机查询 创建条件查询 LockModeConverter负责映射JPA和Hibernate锁定模式如下所示 Hibernate锁定模式 JPA LockModeType 没有 没有 乐观的 读 乐观的 OPTIMISTIC_FORCE_INCREMENT 写 OPTIMISTIC_FORCE_INCREMENT PESSIMISTIC_READ PESSIMISTIC_READ PESSIMISTIC_WRITE 升级 UPGRADE_NOWAIT UPGRADE_SKIPLOCKED PESSIMISTIC_WRITE PESSIMISTIC_FORCE_INCREMENT 力 PESSIMISTIC_FORCE_INCREMENT 不建议使用UPGRADE和FORCE锁定模式而推荐使用PESSIMISTIC_WRITE 。 UPGRADE_NOWAIT和UPGRADE_SKIPLOCKED分别使用Oracle风格的select用于更新nowait或select用于更新跳过锁定语法。 锁定范围和超时 Hibernate还定义了作用域和超时锁定选项 范围 锁定范围允许显式锁定级联到所拥有的关联 。 超时 超时间隔可能会阻止锁定请求无限期地等待。 在我的下一篇文章中我将介绍不同的显式锁定设计样式敬请期待 翻译自: https://www.javacodegeeks.com/2015/01/a-beginners-guide-to-java-persistence-locking.htmljava持久性与安全性