`
_与狼共舞
  • 浏览: 61067 次
  • 性别: 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面试知识点整理总结涵盖了多个关键领域,这对于求职者或希望提升技术能力的Java开发者来说是宝贵的资源。以下是对这些主题的详细阐述: 1. **Java基础**:这是学习任何编程语言的基础,包括变量、数据类型、...

    java开发+精通 经典总结 全是免分资源

    MyBatis作为持久层框架,将SQL语句与Java代码解耦,使得数据库操作更为便捷。 在移动开发领域,Android平台大量使用Java语言,开发者需要学习Android SDK,理解四大组件(Activity、Service、BroadcastReceiver、...

    java后端开发面试题总结

    面试题是评估开发者技能水平的重要工具,以下将根据"java后端开发面试题总结"这一主题,深入探讨相关知识点。 1. **Java基础知识** - **Java语法**:包括类、对象、封装、继承、多态等面向对象编程的基本概念,...

    缓存List并写入文件持久化.zip

    总结来说,“缓存List并写入文件持久化”涉及了内存管理、数据序列化、文件操作和数据持久化等多个IT领域的知识点。通过理解并熟练掌握这些技术,我们可以构建出可靠的、高性能的应用程序,有效地处理和存储大量的...

    java 归纳与总结

    Java是一种广泛使用的面向...以上是对Java基础知识的总结,涵盖了逻辑操作符、接口与类的交互、Web开发技术、并发控制和企业级开发等内容,每个知识点都至关重要,理解并掌握它们是成为一名合格的Java开发者的基础。

    java高级工程师面试总结

    ### Java高级工程师面试总结 #### Java基础 - **Hashtable和HashMap的区别**: - `Hashtable`是线程安全的,而`HashMap`不是。这意味着在多线程环境中使用`Hashtable`时无需额外的同步措施,但这也使得其性能较低...

    Java面试解析总结:Java+Redis+数据库+解决方案+分布式...docx

    ### Java面试解析总结 #### 数据库篇 - **事务四大特性(ACID)**:事务在数据库操作中扮演着至关重要的角色,确保数据的一致性和完整性。ACID特性包括: - **原子性(Atomicity)**:表示事务中的所有操作要么...

    java个人学习笔记总结

    本文将从 JVM、分布式与高并发、以及相关的技术如 Spring、MyBatis、JUC(Java Concurrency Utilities)包、mq、Redis 和 Zookeeper 等方面进行深入探讨。 一、JVM(Java 虚拟机) 1. JVM 是 Java 应用程序的运行...

    专题资料(2021-2022年)java面试题知识点总结.doc

    Java面试题知识点总结 Java是一种广泛应用于互联网的编程语言,以下是Java面试题知识点总结: 一、同步 在Java中,多个线程可以并发控制,但是在操作可共享的资源变量时,可能会导致数据不准确,相互之间产生冲突...

    java相关笔试题大总结

    ### Java相关笔试题知识点总结 #### 一、`java.lang.String` 类的特性与 `StringBuffer` **知识点:** - **String 类的不可变性**:`java.lang.String` 类被设计为 final 类型,意味着它不能被继承,也不允许对其...

    200个Java经典面试题总结附带答案.docx

    Java经典面试题总结附带答案 以下是从给定文件中生成的相关知识点: Java基础 1. JDK 和 JRE 的区别是什么?(JDK 是 Java Development Kit,JRE 是 Java Runtime Environment) 2. `==` 和 `equals` 的区别是...

    最全java面试题及答案(208道).pdf

    本文总结了Java面试题及答案,涵盖了Java基础、容器、多线程、反射、对象拷贝、JavaWeb、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/SpringCloud、Hibernate、MyBatis、RabbitMQ、Kafka、Zookeeper、...

    JAVA核心知识点整理

    Java是世界上最流行的编程语言之一,尤其在企业级应用开发领域占据主导地位。本文将深入探讨在"JAVA核心知识点整理"中涉及的关键概念和技术。 一、Java基础 Java的基础知识包括语法、面向对象特性(封装、继承、...

    最新JAVA面试题总结之数据库.zip

    本资料“最新JAVA面试题总结之数据库”聚焦于Java与数据库相关的面试知识点,旨在帮助求职者更好地准备数据库相关的面试问题。下面我们将深入探讨其中涉及的一些重要概念和技术。 1. **JDBC(Java Database ...

    2011最新最全的JAVA面试题总结.txt

    ### 2011最新最全的JAVA面试题总结 #### 一、JAVA基础知识 **1. 面向对象的特征有哪些方面** 面向对象编程(Object-Oriented Programming, OOP)是现代软件开发中一种重要的编程范式。其核心特征主要包括抽象、...

    Java知识点总结,面试必备,java基础、java集合、JVM、Java并发、剑指offer、MySQL、Redis等.zip

    4. **Java并发**:Java并发处理包括线程、锁机制(synchronized、Lock等)、并发容器(如ConcurrentHashMap、CopyOnWriteArrayList等)、并发工具类(如ExecutorService、CountDownLatch、CyclicBarrier等),以及...

Global site tag (gtag.js) - Google Analytics