请教Hibernate乐观锁和悲观锁相关问题

问题描述

1.这两个锁仅仅是用来解决并发的问题, 防止多人同时操作同一数据造成错误的吗? 2.如果只是用来解决并发操作同一数据的问题, 数据库的隔离级别不就是干这个的吗, 那 乐观锁和悲观锁还有什么意义? 3.是不是隔离级别和锁用一种就可以了, 因为他们解决的是同一种问题

解决方案

隔离级别控制的是事务之间允许并发的程度(这样说可能不太准确,请google 一下read uncommit, read commited, repeatable, serialize几种隔离级别以及相应的案例就清楚了),而锁是控制数据访问的互斥约束,二者不是一回事(当然,也可以用serialize的隔离级别来实现锁的控制,只是效率会低的离谱悲观锁:对加锁的数据禁止任何操作;乐观锁:并不禁止这些操作,但是A加的乐观锁,被B操作了以后(写操作),A的线程会报异常(B操作了以后,版本+1,A实际上是通过版本的变动情况知道被操作的)所以:悲观锁的实现比较简单,但是效率较低,乐观锁的实现实际上需要Catch相应的异常(并不是错误,所以需要给出合适的处理方式,比如重试等)网上的资料很多,讲的也比较清楚,仔细看看就知道了。
解决方案二:
我没用过hibernate,建议你用一下ibatis,更贴数据库一些。隔离级别是用到事务上的,可以看到spring定义了声明式事务和编程式事务,都有不一样的隔离级别。乐观锁和悲观锁是为了数据的一致性、或者脏读什么的。我用悲观锁一般是来做行级防并发用的。

时间: 2024-08-02 13:25:44

请教Hibernate乐观锁和悲观锁相关问题的相关文章

Hibernate乐观锁的实现原理剖析与使用乐观锁时的注意点

Hibernate支持乐观锁.当多个事务同时对数据库表中的同一条数据操作时,如果没有加锁机制的话,就会产生脏数据(duty data).Hibernate有2种机制可以解决这个问题:乐观锁和悲观锁.这里我们只讨论乐观锁. Hibernate乐观锁,能自动检测多个事务对同一条数据进行的操作,并根据先胜原则,提交第一个事务,其他的事务提交时则抛出org.hibernate.StaleObjectStateException异常. Hibernate乐观锁是怎么做到的呢? 我们先从Hibernate乐

乐观锁与悲观锁及应用举例

  最近因为在工作中需要,学习了乐观锁与悲观锁的相关知识,这里我通过这篇文章,把我自己对这两个"锁家"兄弟理解记录下来;       - 悲观锁:正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)的修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态.悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据).       以常用的m

程序中的乐观锁与悲观锁,以及动手实现乐观锁 (转)

概念: 这里抛开数据库来谈乐观锁和悲观锁,扯上数据库总会觉得和Java离得很远. 悲观锁:一段执行逻辑加上悲观锁,不同线程同时执行时,只能有一个线程执行,其他的线程在入口处等待,直到锁被释放. 乐观锁:一段执行逻辑加上乐观锁,不同线程同时执行时,可以同时进入执行,在最后更新数据的时候要检查这些数据是否被其他线程修改了(版本和执行初是否相同),没有修改则进行更新,否则放弃本次操作. 从解释上可以看出,悲观锁具有很强的独占性,也是最安全的.而乐观锁很开放,效率高,安全性比悲观锁低,因为在乐观锁检查数

hibernate 乐观锁 异常没有抛出问题 StaleObjectStateException

问题描述 在java程序内采用hibernate乐观锁,版本号后台数据库有增加,但用trycatch捕捉不到StaleObjectStateException异常.<versionname="theversion"column="theversion"type="java.lang.Integer"/>求救!谢谢! 解决方案 解决方案二:各位有没有碰到类似问题!谢谢!

深入理解Yii2.0乐观锁与悲观锁的原理与使用

本文介绍了深入理解Yii2.0乐观锁与悲观锁的原理与使用,分享给大家,具体如下: Web应用往往面临多用户环境,这种情况下的并发写入控制, 几乎成为每个开发人员都必须掌握的一项技能. 在并发环境下,有可能会出现脏读(Dirty Read).不可重复读(Unrepeatable Read). 幻读(Phantom Read).更新丢失(Lost update)等情况.具体的表现可以自行搜索. 为了应对这些问题,主流数据库都提供了锁机制,并引入了事务隔离级别的概念. 这里我们都不作解释了,拿这些关键

oracle乐观锁和悲观锁概述

一.问题引出 1. 假设当当网上用户下单买了本书,这时数据库中有条订单号为001的订单,其中有个status字段是'有效',表示该订单是有效的: 2. 后台管理人员查询到这条001的订单,并且看到状态是有效的: 3. 用户发现下单的时候下错了,于是撤销订单,假设运行这样一条SQL: update order_table set status = '取消' where order_id = 001: 4. 后台管理人员由于在②这步看到状态有效的,这时,虽然用户在③这步已经撤销了订单,可是管理人员并

关于配置Hibernate乐观锁的问题

问题描述 直接上代码:public class DzCyxx extends BaseEntity<dzcyxx> {private static final long serialVersionUID = 1L;@ManyToOne(cascade = { CascadeType.MERGE })@JoinColumn(name = "RSXX_ID")private HrArchive hrArchives;@ManyToOne(cascade = { CascadeT

详解 hibernate 悲观锁 乐观锁 深入分析 代码实例

首先,为什么要有锁这种概念和技术呢? 什么是锁( locking ) 业务逻辑的实现过程中,往往需要保证数据访问的排他性.如在金融系统的日终结算处理中,我们希望针对某个 cut-off 时间点的数据进行处理,而不希望在结算进行过程中(可能是几秒种,也可能是几个小时),数据再发生变化.此时,我们就需要通过一些机制来保证这些数据在某个操作过程中不会被外界修改,这样的机制,在这里,也就是所谓的 "锁" ,即给我们选定的目标数据上锁,使其无法被其他程序修改.Hibernate 支持两种锁机制:

java-JAVA实现乐观锁,还请高手们解惑。

问题描述 JAVA实现乐观锁,还请高手们解惑. 场景:下单减库存. 现在采用的是先select for update操作,然后再update操作来实现防止超卖. 现在采用的方法是用数据库的锁机制,更新的时候进行行锁,这个应该是oracle或者MySQL的基本原则. 如果我现在想以乐观锁的机制来实现下单减库存,采用版本号的机制. sql为:update table set storage = storage-1,version = version+1 where version=XX 和我不采用版