1.问题来源

就是一数据表的数据  在两个人同时修改的时候  会出现混乱

例子:如一个字段记录status=1 表示可以下单  货品只有1个的时候    a下单的同时b也下单 ; a有修改status的机会  b也有修改的机会;但是a下单成功  b下单未知   这就会出现矛盾 与现实的不想符合!

2.悲观锁

悲观锁是对数据被的修改持悲观态度(认为数据在被修改的时候一定会存在并发问题),因此在整个数据处理过程中将数据锁定。悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在应用层中实现了加锁机制,也无法保证外部系统不会修改数据)。

(翻译:就是悲观锁认为所有的数据表操作都会有并发问题  所以依靠自身的锁机制来一个锁定一次处理完好之后 再进行下一次的数据操作)

3.悲观锁的方法

在上面的场景中,商品信息从查询出来到修改,中间有一个处理订单的过程,使用悲观锁的原理就是,当我们在查询出goods信息后就把当前的数据锁定,直到我们修改完毕后再解锁。那么在这个过程中,因为goods被锁定了,就不会出现有第三者来对其进行修改了。要使用悲观锁,我们必须关闭mysql数据库的自动提交属性。

set autocommit=0;  
//设置完autocommit后,我们就可以执行我们的正常业务了。具体如下:
//0.开始事务
begin;/begin work;/start transaction; (三者选一就可以)
//1.查询出商品信息
select status from t_goods where id=1 for update;
//2.根据商品信息生成订单
insert into t_orders (id,goods_id) values (null,1);
//3.修改商品status为2
update t_goods set status=2;
//4.提交事务
commit;/commit work;

使用了select…for update的方式,这样就通过数据库实现了悲观锁

SELECT ... LOCK IN SHARE MODE 

SELECT ... FOR UPDATE

而主要的不同在于LOCK IN SHARE MODE 在有一方事务要Update 同一个表单时很容易造成死锁。如果SELECT 后面若要UPDATE 同一个表单,最好使用SELECT ... UPDATE

4.Row Lock与Table Lock

默认Row Lock  只要指定id 就是行锁  没有指定就是表锁

5.锁定分析

5.1 明确指定主键,并且有此数据,row lock

5.2 明确指定主键,若查无此数据,无lock

5.3 无主键,table lock

5.4 主键不明确,table lock

5.5 明确指定索引,并且有此数据,row lock

5.6 明确指定索引,若查无此数据,无lock

6.乐观锁

悲观锁:在读取数据时锁住那几行,其他对这几行的更新需要等到悲观锁结束时才能继续 。
乐观所:读取数据时不锁,更新时检查是否数据已经被更新过(添加where条件即可判断是否更新了!),如果是则取消当前更新,一般在悲观锁的等待时间过长而不能接受时我们才会选择乐观锁  适用于高并发的情况

Mysql之乐观锁悲观锁:乐观锁检查数据状态 悲观锁更新时锁定数据相关推荐

  1. mysql单字段更新全字段更新_疑问: 数据库进行更新时 当数据数据相同时 全字段更新和单字段更新是否有区别...

    楼上大致正确,但是 1.前者也是通用的,但要多写一些 setXXX 的代码: 2.第二种方式在并发情况下容易导致前面的update失效,除非整个过程加锁: 请求1: update Student se ...

  2. 聊一聊数据库中的锁分类(乐观锁、悲观锁、共享锁、排它锁、表级锁、行级锁、页面锁)...

    乐观锁和悲观锁(从策略上划分) 乐观锁:乐观锁就如同他的名字一样,非常了乐观,每次去读数据都认为其它事务没有在写数据,总是认为别人不会修改数据,所以就不上锁,只有在线程提交数据时会通过检查版本号的形式 ...

  3. MySQL必知必会——插入、更新和删除数据

    一.插入数据 1.插入 本章节介绍如何利用SQL地INSERT语句将数据插入表中. 插入可以用几种方式使用: 插入完整的行 插入行的一部分 插入多行 插入某些查询的结果 2.插入完整的行 INSERT ...

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

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

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

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

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

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

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

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

  8. mysql锁机制(共享锁(S)、排他锁(X)、意向共享锁(IS)、意向排他锁(IX)的关系,死锁,乐观锁,悲观锁...)

    1. 锁的基础与行锁的特点 1.1 概念 在开发多用户.数据库驱动的应用时,相当大的一个难点就是解决并发性的问题,目前比较常用的解决方案就是锁机制. 锁机制也是数据库系统区别于文件系统的一个关键特性. ...

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

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

最新文章

  1. 一位IT從業人員的心路歷程
  2. 卧槽,面试官质疑我不会配置中心原理,看不起谁呢?
  3. 网站的线下活动如何组织
  4. JAVA中经过nginx反向代理获取客户端ip并获取相关坐标等信息
  5. PS调出清新淡雅外景女生背影照
  6. C:\Python27\python.exe: can't open file '2.py': [Errno 2] No such file or directory
  7. 好像博问不能回复了,看似是某个脚本错误阻止了提交。可有此事?
  8. Oracle查询所有序列;[oracle中如何创建表的自增ID(通过序列);oracle sql语句大全
  9. (61)FPGA译码器实现(function)
  10. python自定义类型转换_Python JSONDecoder自定义null类型的转换
  11. nginx过滤html输入,nginx屏蔽指定接口(URL)的操作方式
  12. tensorflow Image 解码函数
  13. trilateration三边测距算法及C语言实现(适用stm32)
  14. python日历程序编写_Python创建日历实例
  15. Pandas08--文本数据
  16. 小程序全局拖动悬浮球插件
  17. WPS如何将金额快速改为万元显示
  18. 图像分割:LR-ASPP模型介绍
  19. 气象绘图(二)——散点图
  20. 前端面试经历和感想(2019年7月)

热门文章

  1. 最小二乘法(多元)推导
  2. redis 获取所有key_Redis笔记
  3. 初中计算机word教案ppt,初中信息技术课件 用Word处理文字.ppt
  4. 项目实战4—HAProxy实现高级负载均衡实战和ACL控制
  5. 02.Android之IPC机制问题
  6. Linear Regression Example
  7. Flask基础知识点1
  8. salt-master
  9. SCCM2012升级SP1系列之配置管理SCCM2012①发现和管理SCCM2012客户端
  10. ceph集群简单安装部署(Ubuntu14环境)