首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

加锁还是不加锁,这是一个问题

3.不要加锁? 平淡的日子就这么过着, 有一天线程世界来了一个年轻人,自称为小李, 他看着我们这么努力地奋斗着去争抢那把锁, 不由地嘲笑道: 你们真傻啊, 难道不知道不加锁也能做事吗?...这句话把我们镇住了, 我小心翼翼地问: 那你说说,不加锁怎么才能保证正确性呢? “就拿你们的那个Sequence类来说吧, 不就是并发的更新内存中的一个值吗, 可以这么分为三步来做: 1....真的没有加锁啊。 隔壁的小明反应最快: 小李子, 你这第三步有问题啊, 你看需要读内存吧,需要比较吧,还得写入内存吧, 这不是一个原子操作, 在我们多线程并发执行的时候, 肯定会出问题!...我们仔细地审视这段代码, 它根本没有加锁, 每个人都可以进入next()方法, 读取数据,操作数据, 最后使用CAS来决定这次操作是否有效, 如果内存值被别人改过,那就再次循环尝试。

2.2K60
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    面试官:单核服务器可以不加锁吗?

    今天有位同学问了磊哥一个问题,大概的意思是“单核服务器可以不加锁吗?”,我觉得很有意思,所以在这里就和各位探讨一下: 1. 问题答案 先说我的理解,单核服务器仍然需要加锁。...因为在单核服务器上也会有线程切换,如果不加锁,那么线程切换后,另一个线程就可以访问其他线程未操作完的共享变量,这就会导致操作的共享变量发生数据覆盖的问题,所以是需要加锁。...但如果不加锁,即使在单核服务器下也会造成数据覆盖问题,最终的执行结果为 1 的情况,具体执行流程如下: 2. 原因分析 因为 i++ 并不是原子操作,它的执行要分为以下 3 步: 查询 i 的值。...如果是加锁操作,那么线程可以一个个执行,首先某一个线程先把 i 修改为 1,然后另一个线程再次基础上将结果修改为 2。...而线程切换就可能会导致数据覆盖的问题,这就是线程安全问题,所以单核服务器也要加锁。 课后思考 除了锁机制外,还有哪些手段可以保证线程安全?

    13310

    面试官:单核服务器可以不加锁吗?

    今天有位同学问了磊哥一个问题,大概的意思是“单核服务器可以不加锁吗?”,我觉得很有意思,所以在这里就和各位探讨一下:1. 问题答案先说我的理解,单核服务器仍然需要加锁。...因为在单核服务器上也会有线程切换,如果不加锁,那么线程切换后,另一个线程就可以访问其他线程未操作完的共享变量,这就会导致操作的共享变量发生数据覆盖的问题,所以是需要加锁。...但如果不加锁,即使在单核服务器下也会造成数据覆盖问题,最终的执行结果为 1 的情况,具体执行流程如下:2....如果是加锁操作,那么线程可以一个个执行,首先某一个线程先把 i 修改为 1,然后另一个线程再次基础上将结果修改为 2。...而线程切换就可能会导致数据覆盖的问题,这就是线程安全问题,所以单核服务器也要加锁。课后思考除了锁机制外,还有哪些手段可以保证线程安全?

    12110

    【转载】加锁还是不加锁,这是一个问题

    【转载】加锁还是不加锁,这是一个问题 2017-06-14 by Liuqingwen | Tags: 随笔 Java | Hits 非常浅显易懂又寓意深刻的一篇文章,转载自微信公众号...【码农翻身】的文章,好文分享:加锁还是不加锁,这是一个问题,原文链接: http://mp.weixin.qq.com/s/qJNQeuDWjRCxkSG2nSK5Uw 一、前言 上次我说过,我们这个线程的世界是个弱肉强食的地方...三、不要加锁? 平淡的日子就这么过着,有一天线程世界来了一个年轻人,自称为小李,他看着我们这么努力地奋斗着去争抢那把锁,不由地嘲笑道:你们真傻啊,难道不知道不加锁也能做事吗?...这句话把我们镇住了,我小心翼翼地问:那你说说,不加锁怎么才能保证正确性呢?...真的没有加锁啊。 隔壁的小明反应最快:小李子,你这第三步有问题啊,你看需要读内存吧,需要比较吧,还得写入内存吧,这不是一个原子操作,在我们多线程并发执行的时候,肯定会出问题!

    84750

    Innodb加锁规则

    加锁顺序 普通select查询 获取表级锁: MDL读锁 不需要其他锁: 因为使用的是MVCC,所以不需要行锁 ps: 很多地方都说使用了MVCC就不需要加锁,实际上是不需要行锁,MDL读锁还是需要的...再获取表级锁: 意向排它锁 再获取行级锁: 插入意向锁 update/delete 首先获取表级锁: MDL写锁 再获取表级锁: 意向排它锁 再获取行级锁: 根据不同语句获取对应的行锁和间隙锁 行锁加锁规则...两个“原则”、两个“优化”和一个“bug” 原则 1:加锁的基本单位是 next-key lock。...原则 2:查找过程中访问到的对象才会加锁。 优化 1:索引上的等值查询,给唯一索引加锁的时候,next-key lock 退化为行锁。...MySQL加锁分析

    79910

    innodb加锁机制

    序 我们已知,RC、RR下: 快照读(普通select)会开启ReadView,使用mvcc机制防止脏读/不可重复读/幻读,不加锁。...另外: RU下,读取不加锁,修改加锁 RC下,查找索引不用到gap lock和next-key lock,只有record lock。所以当前读只会施加record lock。...SR下,没有mvcc机制,读、写都靠加锁来维持正确性。 我们最常用的还是RR等级,其加锁机制较为复杂,判断条件似乎很多,因此需要重点讨论。...另外,为了简化讨论,本文只讨论RR下select...for update的加锁机制。 1....这时,只需对该记录加锁,就能防止幻读。 加锁机制图解如下: ? 加锁机制 施加gap lock的范围 那么,Innodb会对多大的范围施加gap lock呢?

    1.1K20

    Oracle给Select结果集加锁,Skip Locked(跳过加锁行获得可以加锁的结果集)

    1、通过select for update或select for update wait或select for update nowait给数据集加锁 具体实现参考select for update和select...for update wait和select for update nowait的区别 2、Skip Locked(跳过加锁行获得可以加锁的结果集) Skip locked是oracle 11g引入的...通过skip locked可以使select for update语句可以查询出(排除已经被其他会话加锁了的数据行)剩下的数据集,并给剩下的数据集,进行加锁操作。...a、测试一、 代码如下:新建一个SQL窗口1(相当于新建一个会话),执行 update test8 set price=6 where ID=1 但是不执行commit操作,此时,当前数据已经被加锁了。...此时,不进行commit操作,表中所有的数据行被加锁

    1.9K80

    InnoDB 事务加锁分析

    FOR UPDATE),InnoDB 通过加锁来实现可重复读,且InnoDB 加锁同时解决了幻读问题。...Gap Locks(间隙锁):在索引记录之间加锁,或者在第一个索引记录之前加锁,或者在最后一个索引记录之后加锁。 Next-Key Locks:在索引记录上加锁,并且在索引记录之前的间隙加锁。...四、案例分析 在对SQL进行加锁分析前,需要明确表的结构和索引类型。在不知道索引的情况下直接给出一条SQL来分析如果加锁是没有任何意义的。...MySQL InnoDB的可重复读并不保证避免幻读,需要应用使用加锁读来保证。而这个加锁读使用到的机制就是next-key locks。...可以这么讲,InnoDB提供了这样的机制,在默认的可重复读的隔离级别里,可以使用加锁读去查询最新的数据。

    1.7K00

    MySQL 加锁处理分析

    先对一条满足条件的记录加锁,返回给MySQL Server,做一些DML操作;然后在读取下一条加锁,直至读取完毕。...从上图可以看出,2PL就是将加锁/解锁分为两个完全不相交的阶段。加锁阶段:只加锁,不放锁。解锁阶段:只放锁,不加锁。...为什么聚簇索引上的记录也要加锁?...深入理解MySQL如何加锁,有两个比较重要的作用: 可以根据MySQL的加锁规则,写出不会发生死锁的SQL; 可以根据MySQL的加锁规则,定位出线上产生死锁的原因; 下面,来看看两个死锁的例子 (一个是两个...而使用本文上面提到的,分析MySQL每条SQL语句的加锁规则,分析出每条语句的加锁顺序,然后检查多个并发SQL间是否存在以相反的顺序加锁的情况,就可以分析出各种潜在的死锁情况,也可以分析出线上死锁发生的原因

    3.5K61

    MySQL加锁实战分析

    加锁的基本单位是next-key lock(前开后闭区间) 查找过程中访问到的对象才会加锁 索引上的等值查询,给唯一索引加锁的时候,next-key lock退化为行锁 索引上的等值查询,向右遍历时且最后一个值不满足等值条件的时候...,next-key lock退化为间隙锁 加锁的基本单位虽然是next-key lock,但是在具体执行的时候,是要分成间隙锁和行锁两段来执行的。...: 根据规则1,加锁单位是next-key lock,Session A的加锁范围是(5, 10] 根据规则4,SessionA是等值查询,而id=10不满足等值条件,因此next-key lock退化为间隙锁...next-key lock,因此加锁范围是(0, 5] 索引c是普通索引,根据规则4,最终会退化成间隙锁(5, 10) 根据规则2,只有访问到的对象才会加锁,由于Session A的查询使用覆盖索引,并不需要访问主键索引...因此在删除数据的时候我们如果加上limit,不仅可以控制删除的条数,还可以减小加锁的范围。

    1.1K30

    insert 语句加锁机制

    一 前言 之前的文章里面总结了很多死锁案例,其实里面有几篇文章对于insert加锁流程表述的不准确,而且微信公众号又无法修改,所以通过本文重新梳理insert加锁流程,最后加上一个死锁案例解析...T_T 二 基础知识 在分析死锁案例之前,我们先学习一下背景知识 insert 语句的加锁策略,来看看官方定义: "INSERT sets an exclusive lock on the inserted...然而,文档没有说明的是,对于检测到冲突的唯一索引,等待线程在获得S Lock之后,还需要对下一个记录进行加锁,在源码中由函数row_ins_scan_sec_index_for_duplicate进行判断...| c2 | +----+----+----+ | 27 | 3 | 4 | | 30 | 5 | 8 | +----+----+----+ 无锁阻塞 单纯的insert,无其他事务对相关记录加锁...通过这样的逻辑来测试insert 语句遇到唯一键的时候的加锁流程。

    3.2K30

    MySQL InnoDB 加锁机制

    普通SELECT 时使用一致性非锁定读,MVCC, 不加锁; 锁定读SELECT 使用锁定读(当前读),加锁; 此外,DML(INSERT/UPDATE/DELETE)时,需要先查询表中的记录,此时也使用锁定读...where uni > 50 and uni <= 52 for update; 加锁与a)一致, 这里为什么会对60这个记录加锁?...uni是唯一索引, 那么52之后必定是比52大的索引记录, 即扫描可以到此为止, 不需要再对60加锁. 有人认为这是InnoDB的一个BUG, 后面介绍主键索引范围查询加锁情况的时候再提....11.使用聚簇联合索引的等值查询 加锁与非聚簇联合唯一索引一致 12.使用聚簇联合索引的范围查询 与非聚簇唯一索引范围查询加锁有一点不同, 那就是主键的范围查询不会进行多余加锁 13.混合使用多个索引的查询...有人问hash索引是怎么处理加锁的.

    3K00
    领券