【博客园cnblogs笔者m-yb原创(部分引用, 在文末有注明),转载请加本文博客链接,笔者github: https://github.com/mayangbo666,公众号aandb7,QQ群927113708】

https://www.cnblogs.com/m-yb/p/9974979.html

  最近写代码时, 发现自己对事务和数据库的锁的使用有点不明白, 而这些是面试易考点, 查了些资料, 对这些进行重新梳理表述如下:

  所谓事务是用户定义的一个数据库操作系列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。例如在关系数据库中,一个事务可以是一条sql语句、一组sql语句或整个程序。

  【事务】:对加了事务的一系列操作, 会在执行的时候 -> 同时成功, 同时失败. spring中使用事务, 可在方法头上加这样一行注解代码:

@Transactional(rollbackFor = Exception.class)

  为什么有了事务这东西,还需要乐观锁悲观锁?事务是粗粒度的概念、乐观锁悲观锁可以更细粒度的控制;

比如抢票,假设余票只有1张;隔离级别可以保证事务A和事务B不能读到对方的数据,也不能更新对方正在更新的数据,但是事务A和事务B都认为还有1张余票,于是出票,并更新为0;

  事务解决了并发问题,已经不存在并发问题了;

  但是事务B读取的是过时数据,依据过时数据做了业务处理;

  所以需要乐观锁或者悲观锁,来记录一个信息:当前已经读取的数据,是不是已经过时了!

  事务有这么几种实现方式:锁协议、MVCC、时间戳排序协议、有效性检查协议,锁协议是事务的一种实现方式,事务 = 用锁封装的一个函数,可以重用而已,但是这几个事务的函数覆盖面太粗粒度了,所以有时候我们还得借助于锁来进行细粒度控制;
事务不能保证每个操作结果正确,售票时超卖还是会发生。
事务保证整个操作的成一个组,要么全做要么全不做, 但是不能保证多个事务同时读取同一个数据
数据对象被加上排它锁时,其他的事务不能对它读取和修改;加了共享锁的数据对象可以被其他事务读取,但不能修改
事务可以用锁实现,可以保证一致性和隔离性,但是锁用来保证并发性;
隔离性和并发性有点类似,但是隔离性只是保证不会出现相互读取中间数据,却无法解决并发的问题.

  当业务要求执行这组操作的成功率时, 使用悲观锁;

  当业务要求迅速返回状态的速度时, 使用乐观锁;

  悲观锁(排他锁)、乐观锁(共享锁)在数据库的使用:

悲观锁在sql语句的最后加上 for update【典型应用场景 如 转账时,锁住两边加减余额的操作】

乐观锁可通过版本控制, 在sql语句的更新操作语句中加入 version = #{oldVersion}条件

注本文部分转载自:
作者:chinoukin
来源:CSDN
原文:https://blog.csdn.net/chinoukin/article/details/79005596

转载于:https://www.cnblogs.com/m-yb/p/9974979.html

事务 锁 悲观锁 乐观锁 概念 应用场景 使用方式 小记相关推荐

  1. mysql悲观群_谈谈mysql的悲观和乐观锁

    悲观锁与乐观锁是两种常见的资源并发锁设计思路,也是并发编程中一个非常基础的概念.之前有写过一篇文章关于并发的处理思路和解决方案,这里我单独将对这两种常见的锁机制在数据库数据上的实现进行比较系统的介绍一 ...

  2. java中乐观锁_Java中乐观锁与悲观锁的实现

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

  3. 轻量级锁_一句话撸完重量级锁、自旋锁、轻量级锁、偏向锁、悲观、乐观锁等各种锁 不看后悔系列...

    重量级锁?自旋锁?自适应自旋锁?轻量级锁?偏向锁?悲观锁?乐观锁?执行一个方法咋这么辛苦,到处都是锁. 今天这篇文章,给大家普及下这些锁究竟是啥,他们的由来,他们之间有啥关系,有啥区别. 重量级锁 如 ...

  4. mysql内置乐观锁吗_mysql 乐观锁详解

    乐观锁: 乐观锁( Optimistic Locking ) 相对悲观锁而言,乐观锁机制采取了更加宽松的加锁机制.悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性.但随之而来的就是 ...

  5. Redis的事务和锁机制(乐观锁和悲观锁)

    Redis学习笔记(四) 1,Redis事务的定义 2,Redis事务操作的三个基本命令 3,解决Redis中的事务冲突(乐观锁和悲观锁) 3.1,悲观锁 3.2,乐观锁 3.3,Redis中使用乐观 ...

  6. mysql 悲观锁 共享锁_MySQL 乐观锁 悲观锁 共享锁 排他锁

    乐观锁 乐观锁是逻辑概念上的锁,不是数据库自带的,需要我们自己去实现.乐观锁是指操作数据库时(更新操作),想法很乐观,认为这次的操作不会导致冲突,在操作数据时,并不进行任何其他的特殊处理(也就是不加锁 ...

  7. laravel mysql 悲观锁_浅析乐观锁与悲观锁

    悲观锁 当我们要对数据库中的一条数据进行修改的时候,为了避免同时被其他人修改,最好的办法就是直接对该数据进行加锁以防止并发.这种借助数据库锁机制在修改数据之前锁定,再修改的方式被称为悲观并发控制(PC ...

  8. Mysql 乐观锁 事务,Mysql事务隔离级别与乐观锁的问题

    问题一: 当事务隔离级别设置为可重复读的时候,将所有select过的行都加了读锁,并且记录了版本号,当update 的时候们如果发现版本号变了,则事务失败回滚.不知道我这样理解是否正确? 问题二: 如 ...

  9. MySql悲观锁(行锁)和乐观锁

    什么是乐观锁,什么是悲观锁? 一.并发控制 当程序中可能出现并发的情况时,就需要保证在并发情况下数据的准确性,以此确保当前用户和其他用户一起操作时,所得到的结果和他单独操作时的结果是一样的.这就叫做并 ...

  10. mysql行锁还需要乐观锁吗_mysql行锁、表锁。乐观锁,悲观锁

    锁定用于确保事务完整性和数据库一致性. 锁定可以防止用户读取其他用户正在更改的数据,并防止多个用户同时更改相同的数据. 如果不使用锁定,数据库中的数据可能在逻辑上变得不正确,而针对这些数据进行查询可能 ...

最新文章

  1. Linux(Centos6.5)用户名密码
  2. leetcode-11-盛最多水的容器
  3. 程旭元系统漫画第三期:加班 !
  4. IDEA:com.intellij.execution.ExecutionException: not found for the web module.
  5. pytorch 绘制多个算法loss_PyTorch线性模型和梯度下降
  6. day03_js学习笔记_03_js的事件、js的BOM、js的DOM
  7. css属性之box-shadow
  8. 卷积、卷积矩阵(Convolution matrix)与核(Kernel)
  9. 实时数据库中的二级压缩技术
  10. 极客大学架构师训练营 大数据架构 MapReduce Yarn Hive SQL 第24课 听课总结
  11. MySQL的show global variables like “%timeout%“;
  12. CentOS 7 安装 jdk11
  13. 天猫达尔文商品管理体系通俗简介
  14. pixi.js 5.0_使用Pixi.js进行高级绘图
  15. java 如何测试_java – 如何测试一个变量是否设置?
  16. drive登录不上 华为电脑one_Win10电脑中OneDrive无法登录如何解决
  17. Your hostname, xxx resolves to a loopback address: 127.0.1.1; using x.x.x.x instead(on interface xx)
  18. 一本通1034:计算三角形面积
  19. Linux服务管理-OpenSSH基础操作
  20. JavaSE-网络socket编程

热门文章

  1. 十问:BAT技术大牛的核心学习方法
  2. 长假漫漫,不学门可视化图表课程提高下逼格?
  3. 反射在工厂模式中的使用
  4. java-程序流程控制
  5. contenteditable
  6. SHELL脚本--多命令逻辑执行顺序
  7. ODI11G 在Linux上的安装配置
  8. 【转】Google Chrome浏览器调试
  9. 世事(1987.吴忠)
  10. 2017商业科技市场预测:云计算改变行业的十大关键发展