`
_与狼共舞
  • 浏览: 59650 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Java与持久相关的锁总结

    博客分类:
  • 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提供显式锁为了如下操作:

显式锁类型

   LockModeType 包含下面乐观和悲观锁模式:

 

Lock Mode Type锁模型类型 描述
NONE 如果没有显式锁,应用将使用隐式锁(乐观或悲观)
OPTIMISTIC 总是在事务提交时进行版本检查,这样确保乐观锁可重复读的实现.
READ 等同于 OPTIMISTIC.
OPTIMISTIC_FORCE_INCREMENT 总是累加实体版本(即使此时实体并没有改变) 并在事务提交时进行版本检查,这样确保乐观锁可重复读的实现
WRITE 等同于 OPTIMISTIC_FORCE_INCREMENT.
PESSIMISTIC_READ 将获得共享锁,以阻止其他事务获得PESSIMISTIC_WRITE悲观锁.
PESSIMISTIC_WRITE 获得排他锁,以阻止其他任何事务获得PESSIMISTIC_READPESSIMISTIC_WRITE 锁.
PESSIMISTIC_FORCE_INCREMENT 获得数据库锁,阻止任何其他锁获得PESSIMISTIC_READ或 PESSIMISTIC_WRITE 锁,实体版本在事务提交时累计。

 

锁作用域和超时

   JPA 2.0通过下面值定义 javax.persistence.lock.scope 

  • NORMAL因为对象图会跨越多个数据表,一个显式锁也会涉及到多个表(例如 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锁模型,有一些附加的特定锁选项,显式锁能针对如下操作配置:

   LockModeConverter是负责JPA和Hibernate锁模型映射:

 

Hibernate LockMode JPA LockModeType
NONE NONE
OPTIMISTIC
READ
OPTIMISTIC
OPTIMISTIC_FORCE_INCREMENT
WRITE
OPTIMISTIC_FORCE_INCREMENT
PESSIMISTIC_READ PESSIMISTIC_READ
PESSIMISTIC_WRITE


UPGRADE

UPGRADE_NOWAIT
UPGRADE_SKIPLOCKED
PESSIMISTIC_WRITE
PESSIMISTIC_FORCE_INCREMENT


FORCE
PESSIMISTIC_FORCE_INCREMENT

 

 UPGRADE 和 FORCE 锁模型被PESSIMISTIC_WRITE弃用.

UPGRADE_NOWAIT 和 UPGRADE_SKIPLOCKED 使用Oracle-style select for update nowait 或 select for update skip locked 语法

Hibernate 也定义了 scope and timeout locking options:

分享到:
评论

相关推荐

    java 面试题 总结

    JAVA相关基础知识 1、面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用...

    整理后java开发全套达内学习笔记(含练习)

    synchronized (关键字) 同步(锁) ['siŋkrәnaiz] Thread [java] 线程 [θred] throw (关键字) throws (关键字) [θrәu] 抛出(异常) transient (关键字) 瞬变;临时的['trænziәnt]'(可序列化) valid 正确的,...

    leetcode下载-JavaTopic:Java面试题总结

    Java并发锁synchronized、reentractlock的用法 HashMap数据结构及原理 ConcurrentHashMap数据结构及原理,分段锁机制 NIO、BIO相关 Java多线程篇: 线程池的核心参数及用法说明? 多线程死锁如何排查(考察linux

    java8源码-FiveYears:学习/总结/成长/记录

    java8 源码 FivesYears 学习/总结/成长/记录(2018.2.28 - 2023.2.28) :heart_suit:Java 基础 锁 - 未学习 JVM - 待整理 容器 多线程 集合(底层源码) ArrayList LinkedList Vector HashMap ComcurrentHashMap ...

    java面试题,180多页,绝对良心制作,欢迎点评,涵盖各种知识点,排版优美,阅读舒心

    【数据库】乐观锁与悲观锁的区别 107 【数据库】数据库的三范式 107 【数据库】inner/left/right/full join的区别 109 【数据库】哪些字段该添加索引,哪些不添加? 109 【数据库】分页查询语句怎么写? 110 Mysql...

    repository::seedling: walker-知识库:个人知识库汇总

    二 JavaIO与NIO文章 编程规范 Java 编程规范 数据库 MySQL MySQL 学习与面试 [MySQL Index](Mysql/MySQL Index.md) MySQL高性能优化规范 一千行MySQL命令 事务隔离级别 Redis Redis 总结 Redis持久化 RedLock分布式...

    Spring.3.x企业应用开发实战(完整版).part2

    3.2 相关Java基础知识 3.2.1 简单实例 3.2.2 类装载器ClassLoader 3.2.3 Java反射机制 3.3 资源访问利器 3.3.1 资源抽象接口 3.3.2 资源加载 3.4 BeanFactory和ApplicationContext 3.4.1 BeanFactory介绍 3.4.2 ...

    Spring3.x企业应用开发实战(完整版) part1

    3.2 相关Java基础知识 3.2.1 简单实例 3.2.2 类装载器ClassLoader 3.2.3 Java反射机制 3.3 资源访问利器 3.3.1 资源抽象接口 3.3.2 资源加载 3.4 BeanFactory和ApplicationContext 3.4.1 BeanFactory介绍 3.4.2 ...

    javalruleetcode-ziliao:ziliao

    事务、锁、隔离级别、MVCC、间隙锁、范式。 SQL 基本语法。 Leetcode 上数据库题目的解题记录。 存储引擎、索引、查询优化、切分、复制。 五种数据类型、字典和跳跃表数据结构、使用场景、和 Memcache 的比较、淘汰...

    javalruleetcode-cs_offer:对于cs_offer

    事务、锁、隔离级别、MVCC、间隙锁、范式。 SQL 基本语法。 Leetcode 上数据库题目的解题记录。 存储引擎、索引、查询优化、切分、复制。 五种数据类型、字典和跳跃表数据结构、使用场景、和 Memcache 的比较、淘汰...

    Python核心编程第二版(ok)

     8.6.6 与序列相关的内建函数   8.7 break语句   8.8 continue语句   8.9 pass语句   8.10 再谈else语句   8.11 迭代器和iter()函数   8.11.1 什么是迭代器   8.11.2 为什么要迭代器   ...

    Python核心编程第二版

     8.6.6 与序列相关的内建函数   8.7 break语句   8.8 continue语句   8.9 pass语句   8.10 再谈else语句   8.11 迭代器和iter()函数   8.11.1 什么是迭代器   8.11.2 为什么要迭代器   ...

    leetcodepower-CyC2018:原作者repo地址https://github.com/CyC2018/CS-Notes

    事务、锁、隔离级别、MVCC、间隙锁、范式。 SQL 基本语法。 Leetcode 上数据库题目的解题记录。 存储引擎、索引、查询优化、切分、复制。 五种数据类型、字典和跳跃表数据结构、使用场景、和 Memcache 的比较、淘汰...

    leetcode-CyC2018-CS-Notes:CyC2018-CS-笔记

    事务、锁、隔离级别、MVCC、间隙锁、范式。 SQL 基本语法。 Leetcode 上数据库题目的解题记录。 存储引擎、索引、查询优化、切分、复制。 五种数据类型、字典和跳跃表数据结构、使用场景、和 Memcache 的比较、淘汰...

    Eclipse权威开发指南2.pdf

    第4章 Java程序的运行与调试 107 4.1 运行Java代码...... 108 4.1.1 使用运行和调试命令..... 108 4.1.2 管理启动配置..... 109 4.1.3 对代码片断编辑测试窗页面中的表达式进行求值..... 111 4.2 调试...... 112 ...

    asp.net知识库

    与正则表达式相关的几个小工具 你真的了解.NET中的String吗? .NET中的方法及其调用(一) 如何判断ArrayList,Hashtable,SortedList 这类对象是否相等 帮助解决网页和JS文件中的中文编码问题的小工具 慎用const...

    Eclipse权威开发指南3.pdf

    第4章 Java程序的运行与调试 107 4.1 运行Java代码...... 108 4.1.1 使用运行和调试命令..... 108 4.1.2 管理启动配置..... 109 4.1.3 对代码片断编辑测试窗页面中的表达式进行求值..... 111 4.2 调试.....

    Eclipse权威开发指南1.pdf

    第4章 Java程序的运行与调试 107 4.1 运行Java代码...... 108 4.1.1 使用运行和调试命令..... 108 4.1.2 管理启动配置..... 109 4.1.3 对代码片断编辑测试窗页面中的表达式进行求值..... 111 4.2 调试.....

Global site tag (gtag.js) - Google Analytics