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

MySQL锁相关总结|悲观、乐观、读、表、行、页面、间隙、临键

MySQL总体结构 MySQL可以分成三类:总体、类型、粒度。...乐观 乐观对于数据库的数据的读写持乐观态度,即在整个数据处理的过程中,他很乐观的认为数据保持一致性,所以不加锁,而是通过数据版本记录机制实现。... 又称为排他或者X(Exclusive Lock),如果当前未释放,他阻塞其他的和读。 5. 表也称为表级,就是在整个数据表上对数据进行加锁和释放。...在MySQL中,有两种表模式:一种是表共享(Table Shard Lock),另一种是表独占(Table Write Lock)。...那么对应的如果一个线程获取到一个表的后,只有这个线程可以进行读写操作,其他线程无法对表进行读写操作,直到被释放为止。

13010

ReentrantReadWriteLock其读是共享,共是独占。 读的共享可以保证并发读是非常高效的,读写,读,写写的过程是互斥的。...注: 但是会出现一个问题,就是饥饿现象,上方我们是先运行了所有的线程,读线程是在线程后执行的,假如读线程的数量大于线程数量的话,因的大概率都被读线程执行了,就会造成一种饥饿现象,线程无法满足大量读线程的读操作...,因为线程少的时候抢不到。...通过乐观,当线程没有数据的时候,标志位stamp并没有改变,所以即使有再多的读线程读数据,他都可以读取,而无需获取,这就不会使得线程抢不到了。...可以看到结果,读都可以同时获取,就算线程没有写入数据所有读线程还是在抢占,使用ReadWriteLock也是会出现同样的现象,饥饿。

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

    独占()共享(读)互斥

    独占:指该一次只能被一个线程所持有。对ReentrantLock和Synchronized而言都是独占 共享:指该可被多个线程所持有。...对ReentrantReadWriteLock其读是共享,其是独占。 读的共享可保证并发读是非常高效的,读写,读,写写的过程是互斥的。...使用方法 声明一个读写 如果需要独占则加从可重入读写里得到 demo 如果需要共享则加从可重入读写里得到读demo ReentrantReadWriteLock实现原理简单分析...Sync是如何同时表示读?...,低16位表示个数 一个线程获取到了,并且重入了两次,低16位是3,线程又获取了读,并且重入了一次,高16位就是2 读的获取主要调用AQS的相关Acquire方法,其释放主要用了相关Release

    1.4K30

    小白学习MySQL - 查询表?

    我们知道,Oracle中除了使用select ... for update,其他查询语句不会出现,即没有读,读一致性通过多版本解决的,可以保证在不加锁的情况下读到正确的数据。...问题来了,Oracle中执行的insert into select很正常,不会出现表,难道相同的语句用在了MySQL,就会锁住整张表?...test_1加任何的,只是对'test_1'这行记录加了共享(lock mode S locks gap before rec),其实是加到了索引上, mysql> show engine innodb...test_2上是没有任何,因此不会出现RR锁定test_2的情况, mysql> show engine innodb status \G; ... ------------ TRANSACTIONS...而在RR模式,虽然两个事务做到了真正的隔离,但实际通过加锁,还是产生一些问题的,因此隔离级别的选择,其实还是一种权衡的。

    2.3K30

    MySQL乐观(MySQL乐观)

    悲观与乐观的区别 悲观会把整个对象加锁占为已有后才去做操作,Java中的Synchronized属于悲观。...悲观有一个明显的缺点就是:它不管数据存不存在竞争都加锁,随着并发量增加,且如果的时间比较长,其性能开销将会变得很大。...乐观不获取直接做操作,然后通过一定检测手段决定是否更新数据,这种方式下,已经没有所谓的概念了,每条线程都直接先去执行操作,计算完成后检测是否与其他线程存在共享数据竞争,如果没有则让此操作成功,如果存在共享数据竞争则可能不断地重新执行操作和检测...乐观的缺点 现在已经了解乐观及CAS相关机制,乐观避免了悲观独占对象的现象,同时也提高了并发性能,但它也有缺点: 观只能保证一个共享变量的原子操作。...乐观是对悲观的改进,虽然它也有缺点,但它确实已经成为提高并发性能的主要手段,而且jdk中的并发包也大量使用基于CAS的乐观

    1.4K10

    MySQLMySQL(二)表与行测试

    但是,接着我们又让 客户端2 加一个 ,这个时候就无法正常加了。也就是说,S 与 X 是互斥的,有一个拿到读之后,就没办法再加上了,只能 客户端1 的释放之后才能进行操作。...要注意,我们现在是的整表哦。 接下来,我们就来试试为整张表锁上 。...但是 UNLOCK 不能针对某一张表,而是使用 UNLOCK TABLES; MySQL 自动进行解锁释放。 全局 除了单独一张表之外,我们还可以一个库中所有的表。...对于上面的 意向共享 S 来说,我们可以继续加表,不过只能加 读 ,无法加 。...,同时变成 表 ,因此,下面针对某条单行数据的更新语句就会阻塞。

    15910

    MySQLMySQL(三)元数据与间隙

    MySQL(三)元数据与间隙 在上篇文章中,我们就提到过 元数据 和 间隙 这两个名词,不知道有没有吊起大家的胃口。这俩货又是干嘛的呢?别急,我们一个一个来看。...其实在默认情况下,行 就是 临键 ,它会自己以及附近的数据,但是,如果是主键或者唯一索引,退化成 记录 ,也就是我们习惯说的那个 “行” ,而在大部分情况下,普通的间隙空值操作也退化为 间隙...其实在这里,事务2 虽然也产生了阻塞,但是当 事务1 提交之后,事务2 马上拿到,事务3 还是会在阻塞状态,紧接着 事务2 提交后,事务3 就会插入失败。...因此,后面我们插入一条 id 为 45 的数据也阻塞。 因此,在 更新/删除 数据时,如果是范围条件,即使有索引,也很多间隙,特别是 id 或数据不连续(普通索引)的情况下。...插入数据的情况稍微好一点,毕竟我们更习惯于自增主键的形式插入,但也要注意 自增 的情况,这个我们下回再说。 总结 是不是感觉 间隙 非常复杂?

    15410

    MySQL中的(表、行

    MySQL表级模式     MySQL的表有两种模式:表共享读(Table Read Lock)和表独占(Table Write Lock)。...如何加表     MyISAM在执行查询语句(SELECT)前,自动给涉及的所有表加读,在执行更新操作(UPDATE、DELETE、INSERT)前,自动给涉及的表加写,这个过程并不需要用户干预...MyISAM的调度 前面讲过,MyISAM存储引擎的读和是互斥,读操作是串行的。那么,一个进程请求某个MyISAM表的读,同时另一个进程也请求同一表的MySQL如何处理呢?...答案是写进程先获得。不仅如此,即使读进程先请求先到等待队列,请求后到,插到读请求之前!这是因为MySQL认为请求一般比读请求重要。...、数据行,并分析争用的原因。

    4.8K10

    MySQLMySQL(四)其它概念

    MySQL(四)其它概念 好了,锁相关内容的最后一篇文章了。其实最核心的内容,表、行、读、间隙这些重要的内容我们都已经学习过了,特别是间隙,是不是感觉非常复杂。...它是一个 表级 ,因为要保证多个线程同时插入数据时的增长序列,所以的方式实现。 什么意思呢?...,第一个事务是一个读,第二个事务是一个。...悲观 悲观对数据被其他事务的修改持保守态度,每次拿数据都觉得别人修改数据,所以别人拿到之前都会先上锁,MySQL 中的机制就是悲观。...如果事务都执行得很快,一般也不有太大问题。而且我们大部分的业务都是 读多少 的场景,毕竟 S 是共享的,所以大家日常只是需要注意一下大批量的更新和删除操作以及无法容忍的慢查询语句即可。

    11710

    MySQL:表级、行级、共享、排他、乐观、悲观

    粒度大,发生冲突概率大,并发效率低。 适合查询。 行级: row-level loking,锁住一行记录。 开销大,加锁慢。 死锁。 粒度小,发生所冲突概率小,并发效率高。...适合并发,事务控制。 并不是直接丢记录行加锁,而是对行对应的索引加锁: 如果sql 语句操作了主键索引,Mysql 就会锁定这条主键索引。...如果sql语句操作了非主键索引,MySQL先锁定该非主键索引,再锁定相关的主键索引。 在InnoDB中,如果SQL语句不涉及索引,则会通过隐藏的聚簇索引来对记录加锁。...语法:select id from t_table in share mode; 多个共享可以共存,共享与排他不能共存。 排他: 又称之为X。...悲观: 悲观:悲观地认为,并发问题极易发生。 悲观认为并发问题极易发生,所以每次操作,无论读写,都会对记录加锁,以防止其他线程对数据进行修改。 实现方式:数据库的行、读

    1K20

    MySQL中的(表、行,共享,排它,间隙

    本章我们着重讨论MySQL机制 的特点,常见的问题,以及解决MySQL问题的一些方法或建议。 Mysql用到了很多这种机制,比如行,表,读,都是在做操作之前先上锁。...如何加表 MyISAM在执行查询语句(SELECT)前,自动给涉及的所有表加读,在执行更新操作 (UPDATE、DELETE、INSERT)前,自动给涉及的表加写,这个过程并不需要用户干预,...MyISAM的调度 前面讲过,MyISAM存储引擎的读是互斥的,读写操作是串行的。那么,一个进程请求某个 MyISAM表的读,同时另一个进程也请求同一表的MySQL如何处理呢?...答案是写进程先获得。不仅如此,即使读请求先到等待队列,请求后 到,插到读请求之前!这是因为MySQL认为请求一般比读请求要重要。...数据行,并分析争用的原因。

    2.4K30

    ⑩⑦【MySQL:全局、表级、行级

    设置全局: FLUSH TABLES WITH READ LOCK; MySQL数据备份: # MySQL数据库备份的 (命令行指令) mysqldump -uroot -p密码 备份数据库名>保存备份的文件名...表级 表级: 表级,每次操作锁住整张表。锁定粒度大,发生冲突的概率最高,并发度最低 。应用在MyISAM、InnoDB、BDB存储引擎中。...即阻塞其他客户端的读操作又阻塞其他客户端的操作 元数据 ②元数据(meta data lock,MDL) : ⚪MDL加锁过程是系统自动控制 ,无需显式使用,在访问一张表的时候自动加上。...⚪在MySQL5.5中引入了MDL,当对一张表进行增删改查的时候,加MDL读(共享) ;当对表结构进行变更操作的时候,加MDL(排他) 。...索引上的范围查询(唯一索引),访问到不满足条件的第一个值为止。 间隙唯一目的是防止其他事务插入间隙 。间隙可以共存 ,一个事务采用的间隙不会阻止另一个事务在同一间隙上采用间隙

    36830

    MySQL排它之行、间隙、后码

    MySQL InnoDB支持三种行锁定 行(Record Lock):直接加在索引记录上面,锁住的是key。 间隙(Gap Lock):锁定索引记录间隙,确保索引记录的间隙不变。...行(Record Lock) 当需要对表中的某条数据进行操作(insert、update、delete、select for update)时,需要先获取记录的排他(X),这个就称为行。...Gap Lock) 在MySQL中select称为快照读,不需要,而insert、update、delete、select for update则称为当前读,需要给数据加锁,幻读中的“读”即是针对当前读...*/ COMMIT; 我们可以看出,指定查询某一条记录时,如果这条记录不存在,产生间隙 结论 对于指定查询某一条记录的加锁语句,如果该记录不存在,产生记录和间隙,如果记录存在,则只会产生记录...,只会加记录,不会产生间隙; 普通索引不管是锁住单条,还是多条记录,都会产生间隙; 间隙封锁该条记录相邻两个键之间的空白区域,防止其它事务在这个区域内插入、修改、删除数据,这是为了防止出现 幻读

    2.7K11

    技术分享 | MySQL中查询表 ?

    bisal ,具有十年以上的应用运维工作经验,目前主要从事数据库应用研发能力提升方面的工作,Oracle ACE ,拥有 Oracle OCM & OCP 、EXIN DevOps Master 、SCJP 国际认证...问题来了,Oracle 中执行的 insert into select 很正常,不会出现表,难道相同的语句用在了 MySQL ,就会锁住整张表?...1'这行记录加了共享(lock mode S locks gap before rec),其实是加到了索引上, mysql> show engine innodb status \G; ... --...test_2 上是没有任何,因此不会出现 RR 锁定 test_2 的情况, mysql> show engine innodb status \G; ... ------------ TRANSACTIONS...而在 RR 模式,虽然两个事务做到了真正的隔离,但实际通过加锁,还是产生一些问题的,因此隔离级别的选择,其实还是一种权衡的。 ----

    5.5K10

    MySQL、行、排它和共享

    专栏持续更新中:MySQL详解 事务隔离级别的实现原理:简单来说就是各种机制和MVCC多版本并发控制 我们学习知识的时候,需要了解知识点出现的原因,什么情况下能用到这个知识 我们说到事务,就得说到事务的...一、事务隔离机制的选择 如果我们完全不管,使用未提交读的事务隔离机制,任由这些线程并发操作数据库,那就会出现脏读(读取了未commit的数据)、不可重复读(两次查询值不同)、幻读(两次查询数据量不同)问题...此时会放弃使用索引,因此也不会使用行,而是使用表,比如对一些很小的表,MySQL就不会去使用索引 三、排它(Exclusive)和共享(Shared) 排它,又称为X 共享,又称为...因为现在name走的是索引, 通过zhangsan在辅助索引树上找到它所在行记录的id是7,然后到主键索引树上,获取对应行记录的排他MySQL Server根据情况,在主键索引树和辅助索引树上加锁...Server根据情况,在主键索引树和辅助索引树上加锁) 我们update id=8的数据,成功了。

    25240

    MySQL中的(表、行

    MySQL表级模式 MySQL的表有两种模式:表共享读(Table Read Lock)和表独占(Table Write Lock)。...如何加表 MyISAM在执行查询语句(SELECT)前,自动给涉及的所有表加读,在执行更新操作(UPDATE、DELETE、INSERT)前,自动给涉及的表加写,这个过程并不需要用户干预,因此用户一般不需要直接用...MyISAM的调度 前面讲过,MyISAM存储引擎的读和是互斥,读操作是串行的。那么,一个进程请求某个MyISAM表的读,同时另一个进程也请求同一表的MySQL如何处理呢?...答案是写进程先获得。不仅如此,即使读进程先请求先到等待队列,请求后到,插到读请求之前!这是因为MySQL认为请求一般比读请求重要。...、数据行,并分析争用的原因。

    5.1K20

    Mysql详解(行、表、意向、Gap、插入意向

    (1)首先明确并存的概念是指数据库同时支持表、行,而不是任何情况都支持一个表中同时有一个事务A持有行、又有一个事务B持有表,因为表一旦被上了一个表级的,肯定不能再上一个行级的。...因为上了表级S后,不允许其他事务再加X,所以表级S和X、IX不兼容 上了表级X后,修改数据,所以表级X和 IS、IX、S、X(即使是行排他,因为表级锁定的行肯定包括行级速订的行,所以表级...注意:上了行级X后,行级X不会因为有别的事务上了IX而堵塞,一个mysql是允许多个行级X同时存在的,只要他们不是针对相同的数据行。...(4)插入意向不会阻止任何,对于插入的记录持有一个记录。...test where n > 4 for update,事务B申请Gap(4, ∞),申请成功后,被事务A的x阻塞,直到x被释放。

    2K30

    Mysql

    分为,读,二者读读不阻塞,读写阻塞,写写阻塞 2....行分为共享,排他,即读 多粒度机制自动实现表、行共存,InnoDB内部有意向表 意向共享(IS):事务在给一个数据行加共享前必须先取得该表的IS。...表、行区别 表:开销小,加锁快;不会出现死锁;锁定力度大,发生冲突概率高,并发度最低 行:开销大,加锁慢;会出现死锁;锁定粒度小,发生冲突的概率低,并发度高 InnoDB自动给UPDATE、...DELETE、INSERT加排他(X) InnoDB查找时,只有用到了索引才加行,否则加表 MyISAM自动给SELECT加读,自动给UPDATE、DELETE、INSERT加写 MyISAM...查询和插入可以并发,若表中没有被删除的行,可在一个进程读表的同时,另一个进程从表尾插入数据,InnoDB不行 mysql中同时加锁,优先于读 4.

    1K20
    领券