悲观锁与乐观锁

1.场景

并发更新数据,若不加锁可能导致新数据被老数据覆盖。

2.思想

乐观锁,其实就是不加锁。它有乐观的态度,认为“我操作的数据没有被别人更新”。提交时万一发现已被修改就回滚。
悲观锁,悲观的态度,数据时时刻刻都会被更新,我就先将其先锁住,让别人用不了,我操作完成后再释放掉。

3.实现

乐观锁。为数据维护一个版本号(如在表中多加一列),当被更新时版本号自增。获取数据时同时拿到数据本身及当前版本号,若提交前数据被别人更新,那么在提交时服务端发现版本号过低就不提交。
悲观锁。需要数据库级别的的实现,程序中是做不到的,如果在长事务环境中,数据会一直被锁住,导致并发性能大大地降低。
写法一般是"select * from table where xxx for update",数据处理完毕后再update。

时间: 2024-12-22 10:04:22

悲观锁与乐观锁的相关文章

数据库悲观锁和乐观锁

一.Oracle Oracle数据库悲观锁与乐观锁是本文我们主要要介绍的内容.有时候为了得到最大的性能,一般数据库都有并发机制,不过带来的问题就是数据访问的冲突.为了解决这个问题,大多数数据库用的方法就是数据的锁定. 数据的锁定分为两种方法,第一种叫做悲观锁,第二种叫做乐观锁.什么叫悲观锁呢,悲观锁顾名思义,就是对数据的冲突采取一种悲观的态度,也就是说假设数据肯定会冲突,所以在数据开始读取的时候就把数据锁定住.而乐观锁就是认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数

关于悲观锁和乐观锁的区别(最直观理解)

悲观锁(Pessimistic Lock): 每次拿数据的时候都会担心会被别人修改(疑心重很悲观),所以每次在拿数据的时候都会上锁.确保自己使用的过程中不会被别人访问,自己使用完后再解锁. 期间需要访问该数据的都会等待. 乐观锁(Optimistic Lock): 每次拿数据的时候都完全不担心会被别人修改(心态好很乐观),所以每次在拿数据的时候都不会上锁.但是在更新数据的时候去判断该期间是否被别人修改过(使用版本号等机制),期间该数据可以随便被其他人读取. 两种锁各有优缺点,不能单纯的定义哪个好

mysql悲观锁以及乐观锁总结和实践

注:本文乃转载,原文作者@青葱岁月 悲观锁介绍(百科): 悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态.悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据).   使用场景举例:以MySQL InnoDB为例 商品goods表中有一个字段status,status为1代表商

【hibernate框架】使用hibernate实现悲观锁和乐观锁

四种隔离机制不要忘记:(1,2,4,8) 1.read-uncommitted:能够去读那些没有提交的数据(允许脏读的存在) 2.read-committed:不会出现脏读,因为只有另一个事务提交才会读取来 结果,但仍然会出现不可重复读和幻读现象. 4.repeatable read:MySQL默认.可重复读,读数据读出来之后给它加把锁, 其他人先别更新,等我用完了你再更新.你的事务没完,其他事务就不可能改这条记录. 8.serializable:序列化,最高级别.一个一个来,不去并发.效率最低

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

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

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

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

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

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

【锁】Oracle锁系列

[锁]Oracle锁系列 1  BLOG文档结构图           2  前言部分 2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① 锁的概念.分类.及其模拟 ② 查询锁的视图及视图之间的关联 ③ 锁的参数(DML_LOCKS.DDL_LOCK_TIMEOUT) ④ FOR UPDATE及FOR UPDATE OF系列 ⑤ 带ONLINE和不带ONLINE创建索引的锁情况(是否阻塞DML操作) ⑥ 包或存

oracle乐观锁和悲观锁概述

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