悲观锁与乐观锁是解决资源并发场景的解决方案

CREATE TABLE `order_stock` (

`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',

`oid` int(50) NOT NULL COMMENT '商品ID',

`quantity` int(20) NOT NULL COMMENT '库存',

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

乐观锁 OCC

每个事务会先检查在该事务读取数据后,有没有其他事务又修改了该数据。如果其他事务有更新的话,正在提交的事务会进行回滚。

UPDATE order_stock SET quantity = quantity - 1 WHERE oid = 1 AND quantity - 1 > 0;

【优点】

乐观锁相信事务之间的数据竞争(data race)的概率是比较小的,因此尽可能直接做下去,直到提交的时候才去锁定,所以不会产生任何锁和死锁;

可以快速响应事务,随着并发量增加,但会出现大量回滚出现;

效率高,但是要控制好锁的力度。

【缺点】

如果直接简单这么做,还是有可能会遇到不可预期的结果,例如两个事务都读取了数据库的某一行,经过修改以后写回数据库,这时就遇到了问题;

随着并发量增加,但会出现大量回滚出现。

悲观锁 PCC

采用了“一锁,二查,三更新”模式,就是采用数据库中自带 select ... for update 关键字进行对当前事务添加行级锁??,先将要操作的数据进行锁上,之后执行对应查询数据并执行更新操作。

BEGIN

SELECT quantity FROM order_stock WHERE oid = 1 FOR UPDATE;

UPDATE order_stock SET quantity = 2 WHERE oid = 1;

COMMIT;

如果在MySQL中用悲观锁务必要确定走了索引,而不是全表扫描。

【优点】

“先取锁再访问”的保守策略,为数据处理的安全提供了保证;

【缺点】

依赖数据库锁,效率低;

处理加锁的机制会让数据库产生额外的开销,还有增加产生死锁的机会;

降低了并行性,一个事务如果锁定了某行数据,其他事务就必须等待该事务处理完才可以处理那行数据。

mysql 乐观锁和悲观锁,MySQL中的悲观锁与乐观锁相关推荐

  1. java可重入锁是什么意思_Java中的可重入(Reentrant)锁

    ## 什么是可重入锁? 可重入锁是一种特殊的互斥锁,它可以被同一个线程多次获取,而不会产生死锁. 1. 首先它是互斥锁:任意时刻,只有一个线程锁.即假设A线程已经获取了锁,在A线程释放这个锁之前,B线 ...

  2. MySQL中的悲观锁和乐观锁

    悲观锁(Pessimistic Lock) 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁.传统的关系型数据库 ...

  3. mysql悲观锁会有脏数据吗_mysql悲观锁原理详解

    mysql中的锁概念 mysql已经成为大家日常数据存储的最常用平台,但随着业务量和访问量的上涨,会出现并发访问等场景,如果处理不好并发问题的话会带来严重困扰.下面介绍一下如何通过mysql的悲观锁来 ...

  4. mysql默认锁机制是什么_MySQL中锁机制的原理是什么

    MySQL中锁机制的原理是什么 发布时间:2020-12-08 14:48:30 来源:亿速云 阅读:81 作者:Leah MySQL中锁机制的原理是什么?针对这个问题,这篇文章详细介绍了相对应的分析 ...

  5. mysql 高并发写入锁表_使用mysql中的锁解决高并发问题

    阿里云产品通用代金券,最高可领1888分享一波阿里云红包. 阿里云的购买入口 为什么要加锁 多核计算机的出现,计算机实现真正并行计算,可以在同一时刻,执行多个任务.在多线程编程中,因为线程执行顺序不可 ...

  6. mysql什么情况会加意向锁_MySQL中的锁4-插入意向锁和自增锁

    插入意向锁(Insert Intention Lock) 插入意向锁本质上可以看成是一个Gap Lock 普通的Gap Lock 不允许 在 (上一条记录,本记录) 范围内插入数据 插入意向锁Gap ...

  7. mysql数据库的行级锁有几种_MySQL中的行级锁、表级锁、页级锁

    在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足. 在DBMS中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引擎).表级锁(MYISAM ...

  8. Java 中的悲观锁和乐观锁的实现

    锁(locking) 业务逻辑的实现过程中,往往需要保证数据访问的排他性.如在金融系统的日终结算 处理中,我们希望针对某个cut-off时间点的数据进行处理,而不希望在结算进行过程中 (可能是几秒种, ...

  9. mysql innodb禁用事务_MySQL InnoDB事务中锁问题(三)

    试想,事务如果都是串行的,那么就不需要锁了,但是性能肯定没法接受.加锁只是为了提高事务并行度,并且解决并发事务执行过程中引起的脏写.脏读.不可重复读.幻读这些问题的一种解决方案(MVCC算是一种解决脏 ...

  10. Mysql中的读写锁,表锁和行锁,间隙锁

    Mysql数据库锁 锁是计算机协调多个进程或线程并发访问某一资源的机制. 在数据库中,除传统的计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的 ...

最新文章

  1. 基础数据结构【三】————老鼠走迷宫问题————堆栈应用
  2. WAIC开发者日倒计时两天,收藏好这份完整日程
  3. iReport序号自增列
  4. oracle调度不见了,Oracle作业job 没有自动调度起来
  5. 细数开源历史上的九个重大事件
  6. 前端学习(1352)模板语法
  7. 黑客攻防技术宝典Web实战篇第2版—第4章 解析应用程序
  8. HIT Software Construction Review Notes(3-1 Data Type and Type Checking)
  9. COdeSmith的教程 CHM格式
  10. 向量自回归模型(VAR)及其R语言实现
  11. audio语音播放组件
  12. 如何在CSDN中发表博客
  13. redis的failover ,redmon安装
  14. iconfont 字体图标
  15. Mac文件编码格式转换
  16. java 换行符转换
  17. python绘制网格线在原图上面_图像上使用JES(python)的白色网格线
  18. Java虚拟机是如何识别目标方法的?
  19. (二)地理信息中对地球的描述-地球的大地水准面、地球椭球体、大地基准面
  20. 比较两组数据的差异用什么图更直观_扩增子图表解读7三元图:三组差异数量和关系...

热门文章

  1. 可视化Python编译软件:GUI2Exe
  2. C# DataTable 用法简介
  3. 使用MyEclipse快速开发图形化界面
  4. golang设置title并获取窗口句柄
  5. pytorch版本问题:AttributeError: 'module' object has no attribute '_rebuild_tensor_v2'
  6. mysql binlog 日志
  7. php中global和$GLOBALS[]的分析之一
  8. 数据库点滴积累——索引
  9. Java同步组件之CyclicBarrier,ReentrantLock
  10. 系列TCP/IP协议-ARP与RARP