花卉网站源码,澄迈住宅与建设局网站,查网站排名,python 编辑wordpress并发主题Java与持久相关的锁总结本文总结Java中有关数据库保存持久数据的锁机制#xff0c;不只是纯粹数据库自身的锁#xff0c;本文主要就Java持久层三个技术数据库、JPA和Hibernate的锁应用进行了总结。在并发理论中#xff0c;锁是用于保护可变的共享数据#xff0c;以…并发主题Java与持久相关的锁总结本文总结Java中有关数据库保存持久数据的锁机制不只是纯粹数据库自身的锁本文主要就Java持久层三个技术数据库、JPA和Hibernate的锁应用进行了总结。在并发理论中锁是用于保护可变的共享数据以保证数据的完整性大多数应用程序都是依赖于数据库本身提供的隐藏在数据库机制内的锁技术很多初学者可能都没有意识到。将整个系统的锁职责委托给数据库系统虽然可以简化应用程序的开发防止并发问题如死锁但是还是有可能出现死锁的但是数据库可以检测到并采取安全措施比如任意释放两个竞争锁中一个。物理锁大多数的数据库系统使用的是共享读锁和排他写锁这是因为其特定的锁元素(行 表)而物理锁是由SQL标准确定的其悲观的方式可能或妨碍系统的伸缩扩展性Scalable。大多数数据库是使用轻量的锁技术比如多版本并发控制隐式的数据库锁机制的背后是事物隔离级别设置ACID每个隔离级别是一个预定义的锁方案目的是防止某一组数据的完整性异常。READ COMMITTED(已提交读取)是使用查询级别的共享锁对于当前事务中修改数据的操作采取排他锁REPEATABLE (可重复读)和SERIALIZABLE (序列化)是在读取和写入排他锁需要时使用事务级别的共享锁。逻辑锁如果说数据库锁对于批处理系统已经足够那么对于跨越多个数据库的多个Web请求来说这种长对话事务需要一个逻辑(乐观)锁机制则是更合适些。Hibernate提供的乐观锁(conversation-level repeatable read storage)可以确保数据的完整性但是缺乏交易的可扩展性JPA提供乐观锁和持久上下文可重复读两种机制为实现逻辑锁提供了多样选择。显式锁前面提到由数据库和持久框架提供的隐式锁已经满足大多数应用程序的并发控制要求了但是有时如果你需要一个更细粒度的锁策略那么就需要使用显式锁了。大多数数据库系统支持查询时间独占锁指令如 SELECT FOR UPDATE or SELECT FOR SHARE因此我们可以使用较低级别的默认隔离级别(READ COMMITTED)而具体交易情况使用共享和独占锁。大部分乐观锁实现只是验证修改的数据但是JPA允许你明确指定乐观锁的方式。JPA锁作为数据库抽象层JPA能够从底层RDBMS锁获得隐式的锁机制JPA也提供优化可选自动的尸体版本控制机制。JPA提供显式锁为了如下操作locking 锁定一个存在的持久化上下文实体querying 通过JPQL查询, 或通过Criteria 或数据库SQL查询显式锁类型LockModeType 包含下面乐观和悲观锁模式锁作用域和超时JPA 2.0通过下面值定义javax.persistence.lock.scopeNORMAL因为对象图会跨越多个数据表一个显式锁也会涉及到多个表(例如 joined inheritance, secondary tables).因为整个实体相关联的行被锁住many-to-one多对一和一对一one-to-one外键将锁定但不会锁定对方父关联这个作用域不会涉及到子集。EXTENDED这个显式锁将涉及到元素集合和junction tables, 但是不会实际锁定子实体这个锁用于防止删除现有的子对象是有用的同时允许幻读phantom reads或实际子实体状态的改变。JPA 2.0也引入了javax.persistence.lock.timeout属性我们能够配置多少毫秒超时这样一个请求在这个锁必须等待一直到过了超时然后会抛出PessimisticLockException。Hibernate锁Hibernate支持所有JPA锁模型有一些附加的特定锁选项显式锁能针对如下操作配置创建一个实体或原生数据库查询Query创建一个creating aCriteriaqueryLockModeConverter是负责JPA和Hibernate锁模型映射