`
supben
  • 浏览: 326364 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

数据库隔离级别 悲观琐,乐观锁

 
阅读更多
关于隔离级别这篇说的最好了:http://singo107.iteye.com/blog/1175084


我补充的是更新丢失的问题。
当然 所有事务串行情况下不可能出现这个问题。
但就像文章说的 Serializable级别几乎在实际项目中是不会出现的。

先看更新丢失的场景吧:其实都不用绝对并发就会出现。

比如同一件商品被在2个请求中分别被购买1件, 请求A取出库存是100,大于等于1,那么可以购买。请求B比请求A慢2秒进来,取出库存也是100,OK,也可以购买。
这时候经过大量的业务处理,比如花费了3秒钟,A把商品库存修改为 100-1 =99;
2秒后紧接着B也会执行完业务逻辑,修改库存也是把读到的库存减去1 100-1 =99。

很显然,正确结果应该是98。这就所谓的更新丢失,先更新的没起到作用(如果2次是修改不同字段,就是丢失)。


在非 Serializable 级别下,怎么解决这个问题呢。


悲观锁方法:悲观锁是数据库实现的,查询的时候在sql语句最后加上 for update关键字,会在读之后把这条锁住。其他事务甚至都不能读!其实相当于还是把事务弄成串行。。。很显然高并发下完全不可行。

乐观锁方法:乐观锁其实由程序来实现,每条记录修改后都带一条版本号,假如请求A读取到100的版本号是1,那么修改的时候检查下,当前版本号和读的版本号是不是一致,一致的话,可以修改。 修改成99后立即把该条记录的版本号变成2。

这时候B请求呢,发送修改命令的时候,提供的版本号还是1,和当前版本号2对不上,不允许修改。。。

用的CAS方法,其实这个方法极其常用,比如svn。。。
乐观锁的缺点。它不是数据库级别的,假使有另外一套程序也来操作这个数据,就管不了。


为什么第一种方法叫悲观锁呢,因为他认为,每一次读数据都可会冲突,但是这终究还是少数情况。所以说他的世界观悲观。。。乐观锁就乐观多了。

恩,就补充这么多。



0
7
分享到:
评论

相关推荐

    实例讲解MySQL中乐观锁和悲观锁

    乐观锁和悲观锁式并发控制主要采用的技术手段 悲观锁 在关系数据库管理系统中,悲观并发控制(悲观锁,PCC)是一种并发控制的方法。它可以阻止一个事务以影响其他用户的方式来修改数据。如果一个事务执行的操作的每...

    基于Django的乐观锁与悲观锁解决订单并发问题详解

    前言 ...如果是Django2.0以下的版本,需要去修改到这个隔离级别,不然乐观锁操作时无法读取已经被修改的数据 RepeatableRead(可重读) 这是这是Mysql默认的隔离级别,可以到mysql的配置文件中去修改;

    解析数据库锁协议和InnoDB的锁机制(全面解析行级锁、表级锁、排他锁、共享锁、悲观锁、乐观锁等常用锁)

    如果对事务隔离级别以及并发事务带来的问题不熟悉可以翻阅我的另外一篇博文–《解析事务隔离(事务隔离是如何解决脏读、幻读、不可重复读等问题)》 这篇文章中会涉及一些MVCC以及快照读、当前读的概念,如果不是很...

    Java面试题mysql数据库和jvm知识面试题用于技能提升和面试提升

    SQL优化 3 数据库优化 6 DB&SQL优化 7 索引 8 分库分表分区 8 ...乐观锁悲观锁 17 JVM内存结构 19 内存结构 19 Java堆 20 JVM GC过程 20 GC执行机制(回收器) 21 JVM判断对象是否可以被回收算法等等。

    27道高级开发数据库面试题目以及答案.pdf

    描述一下mysql的乐观锁和悲观锁,以及mysql锁的种类; mysql如何做分库分表的; mysql描述一下mysql主从复制的机制的原理;mysql主从复制主要有几种模式 在mysql开启Binlog(为了其他非事务引擎复制所以引入binlog,...

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

    为了应对这些问题,主流数据库都提供了锁机制,并引入了事务隔离级别的概念。 这里我们都不作解释了,拿这些关键词一搜,网上大把大把的。 但是,就于具体开发过程而言,一般分为悲观锁和乐观锁两种方式来解决并发...

    Mysql面试题总结大全

    乐观锁与悲观锁的具体区别 8、数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询,更新数据库表中数据。索引的实现通常使用B树以其变种B+树。 9、索引的工作原理及其种类 在数据之外,数据库系统还...

    常见(MySQL)面试题(含答案).docx

    数据库悲观锁和乐观锁的原理和应用场景? 如何做 MySQL 的性能优化? 索引是什么?MySQL为什么使用B+树,而不是使用其他?B+树的特点 创建索引时需要注意什么? CHAR和VARCHAR的区别? NOW()和CURRENT_DATE()有...

    100道mysql的面试题

    2. 文档内容包括mysql索引,索引失效,覆盖索引,回表,二叉树,死锁,读写分离,分库分表,分库分表中间件,聚集索引或非聚集索引, 索引优化,事务级别,幻读,脏读,不可重复读,数据库的乐观锁和悲观锁,SQL优化...

    mysql面试题100题,包含答案和解析.docx

    13、数据库的乐观锁和悲观锁。 14、SQL优化的一般步骤是什么,怎么看执行计划(explain),如何理解其中各个字段的含义。 15、select for update有什么含义,会锁表还是锁行还是其他。 16、MySQL事务得四大特性以及...

    数据库 面试题 实战解答

    目录:1、触发器的作用?2、什么是存储过程?用什么来调用?3、 存储过程的优缺点4、索引的作用...15、数据库的乐观锁和悲观锁是什么?16、事务隔离级别?17、Truncate与delete区别?1,使用 DELETE 语句删除数据时,Or

    SQL 事务与锁 详解

    本篇博客旨在记录数据库中事务与锁机制的必要性,记录了如何在数据库中使用事务与锁机制实现数据库的一致性以及并发性。... 悲观锁与乐观锁3. 事务的ACID特性3.1. ACID特性3.2. 事务的隔离级别与并发问题3.

    聊聊高并发高可用那些事(Kafka、Redis、MySQL)

    - 乐观锁和悲观锁 - 分库、分表、分区 - 存储过程、定时任务 - MySQL 视图 (VIEW) - Redis 和 MySQL 双写一致性 - 高并发高可用方案 - Join语句还能不能用? - 主从同步有延迟怎么办? - .frm .myi .myd .ibd 文件 - ...

    阿里P7面试题整理集合

    乐观锁悲观锁等)、唯一索引和普通索 引的区别聊到了changeBuffer,聊了页分裂合页合并)比重较大 3)jvm调优(可达性分析算法中根节点有哪些、cms和G1区别、怎样GC调优、 怎样排查CPU彪高、内存彪高、逃逸分析) 4...

    一次性搞定数据库事务

    彻底搞清楚MySQL的各种锁:行锁、表锁、共享锁、排它锁、Next-Key锁、间隙锁、X锁、S锁、IS锁、IX锁、死锁、索引与锁、意向锁等。 彻底搞清楚Spring事务的7种传播级别的原理和使用:PROPAGATION_REQUIRED、...

    SQL Server 2008数据库设计与实现

     10.5.2 隔离级别  10.6 完整性与并发性编程  10.6.1 悲观锁定  10.6.2 实现单线程代码块  10.6.3 乐观锁定  10.6.4 基于行的锁定  10.6.5 逻辑工作单元  10.7 最佳实践  10.8 总结 第11章 数据...

    【白雪红叶】JAVA学习技术栈梳理思维导图.xmind

    乐观锁 行级锁 分布式锁 分区排队 一致性 一致性算法 paxos zab nwr raft gossip 柔性事务(TCC) 一致性原理 CAP BASE 中间件 数据库 mysql 存储引擎 索引 锁 oracle db2 缓存 redis ...

    learning-notes:关于我学到的东西的笔记

    SQL中的乐观锁和悲观锁 事务隔离级别 Java 并发 日期和时间API 等于 例外情况 泛型 介面 Java平台模块系统 Lambda表达式 可选类型 重载,重载和方法隐藏 溪流 并发细节 锁定 线程安全 线程数 JavaScript 事件循环 ...

    Oracle 9i&10g编程艺术:深入数据库体系结构(全本)含脚本

    7.2 事务隔离级别 230 7.2.1 READ UNCOMMITTED 232 7.2.2 READ COMMITTED 233 7.2.3 REPEATABLE READ 235 7.2.4 SERIALIZABLE 237 7.2.5 READ ONLY 239 7.3 多版本读一致性的含义 240 7.3.1 一种会失败的常用...

Global site tag (gtag.js) - Google Analytics