首页
学习
活动
专区
圈层
工具
发布

MySQL的insert into select 引发锁表

MySQL一般我们在生产上备份数据通常会用到 这两种方法: INSERT INTO SELECT CREATE TABLE AS SELECT 注:本文仅针对MySQL innodb引擎,事务是可重复读...是逐行加锁的(扫描一个锁一个),直至锁住所有符合条件的数据,执行完毕才释放锁。...CREATE table table1 as SELECT id FROM table2; -- 只复制id这一列 注意此建表过程全程锁表。语句执行完毕,才释放元数据锁。...MDL全称为metadata lock,即元数据锁。MDL锁主要作用是维护表元数据的数据一致性,在表上有活动事务(显式或隐式)的时候,不可以对元数据进行写入操作。...因此从MySQL5.5版本开始引入了MDL锁,来保护表的元数据信息,用于解决或者保证DDL操作与DML操作之间的一致性。 注意: 新表不会自动创建创建和原表相同的索引。

2.5K10

MySQL的insert into select 引发锁表

MySQL一般我们在生产上备份数据通常会用到 这两种方法: INSERT INTO SELECT CREATE TABLE AS SELECT 注:本文仅针对MySQL innodb引擎,事务是可重复读...Table2必须存在,并且字段field,field2…也必须存在 (2)注意Table2的主键约束,如果Table2有主键而且不为空,则 field1, field2…中必须包括主键 在执行语句的时候,MySQL...是逐行加锁的(扫描一个锁一个),直至锁住所有符合条件的数据,执行完毕才释放锁。...CREATE table table1 as SELECT id FROM table2; -- 只复制id这一列 注意此建表过程全程锁表。语句执行完毕,才释放元数据锁。...因此从MySQL5.5版本开始引入了MDL锁,来保护表的元数据信息,用于解决或者保证DDL操作与DML操作之间的一致性。 注意: 新表不会自动创建创建和原表相同的索引。

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

    mysql 中select for update 锁表的范围备注

    mysql的锁表范围测试 1.主键明确时,行级锁:   解释:指定主键并且数据存在时,仅锁定指定的行,其它行可以进行操作   实例:指定了锁定id=1的行且数据存在①,在更新1时lock wait超时②...,但是更新id不为1的项目时可以直接更新③,释放锁后④,可以任意更新⑤ ?...2.主键不明确时,表级锁:   解释:指定主键不明确或者数据不存在时,整表锁定   指定主键不明确包括使用in、not in、等  ?...3.使用非主键限定时,表级锁:   解释:如果where条件中不存在主键限定而采用非主键筛选,全表锁定 ? 所以要实现行级锁来实现高并发场景时,必须明确指定主键,否则整个表锁定,影响其它线程操作。

    3.8K20

    数据库:MySQL 中 “select ... for update” 排他锁分析

    Mysql InnoDB 排他锁 场景分析 测试环境 总结 参考资料 ---- Mysql InnoDB 排他锁 用法:select … for update; 例如:select * from goods...在进行事务操作时,通过“for update”语句,MySQL会对查询结果集中每行数据都添加排他锁,其他线程对该记录的更新与删除操作都会阻塞。排他锁包含行锁、表锁。...,如果索引值是枚举类型,mysql也会进行表锁,这段话有点拗口,大家仔细理解一下。...2、由于MySQL的行锁是针对索引加的锁,不是针对记录加的锁,所以虽然是访问不同行的记录,但是如果是使用相同的索引键,是会出现锁冲突的。应用设计的时候要注意这一点。...因此,在分析锁冲突时,别忘了检查SQL的执行计划,以确认是否真正使用了索引。 5、检索值的数据类型与索引字段不同,虽然MySQL能够进行数据类型转换,但却不会使用索引,从而导致InnoDB使用表锁。

    2K40

    数据库:MySQL 中 “select ... for update” 排他锁分析

    Mysql InnoDB 排他锁 用法:select … for update; 例如:select * from goods where id = 1 for update; 排他锁的申请前提:没有线程对该结果集中的任何行数据使用排他锁或共享锁...在进行事务操作时,通过“for update”语句,MySQL会对查询结果集中每行数据都添加排他锁,其他线程对该记录的更新与删除操作都会阻塞。排他锁包含行锁、表锁。...,如果索引值是枚举类型,mysql也会进行表锁,这段话有点拗口,大家仔细理解一下。...2、由于MySQL的行锁是针对索引加的锁,不是针对记录加的锁,所以虽然是访问不同行的记录,但是如果是使用相同的索引键,是会出现锁冲突的。应用设计的时候要注意这一点。...因此,在分析锁冲突时,别忘了检查SQL的执行计划,以确认是否真正使用了索引。 5、检索值的数据类型与索引字段不同,虽然MySQL能够进行数据类型转换,但却不会使用索引,从而导致InnoDB使用表锁。

    3.9K30

    select......for update会锁表还是锁行?

    select查询语句是不会加锁的,但是select .......for update除了有查询的作用外,还会加锁呢,而且它是悲观锁。 那么它加的是行锁还是表锁,这就要看是不是用了索引/主键。...没用索引/主键的话就是表锁,否则就是是行锁。...图一为第一个事务,并且没有提交事务 图二为第二个事务,去更新数据,被阻塞了 图三为第二个事务,长时间拿不到锁报错。...实例4: 使用普通的字段code去操作 另一个事务我去更新另外一条数据,如果我更新成功了,就是锁行,失败了就是锁表。...结果: 如果查询条件用了索引/主键,那么select ..... for update就会进行行锁。 如果是普通字段(没有索引/主键),那么select ..... for update就会进行锁表。

    1.5K20

    select...for update 锁表了?

    前言 前几天,知识星球中的一个小伙伴,问了我一个问题:在MySQL中,事务A中使用select...for update where id=1锁住了,某一条数据,事务还没提交,此时,事务B中去用select...select...for update在MySQL中,是一种悲观锁的用法,一般情况下,会锁住一行数据,但如果没有使用正确的话,也会把整张表锁住。...目前MySQL中使用比较多的有:表锁、行锁和间隙锁。 我们这个业务场景,非常时候使用行锁。...在MySQL中是通过select...for update语句来实现的行锁的功能。 但如果你在实际工作中使用不正确,也容易把整张表锁住,严重影响性能。...总结 最后给大家总结一下select...for update加锁的情况: 主键字段:加行锁。 唯一索引字段:加行锁。 普通索引字段:加行锁。 主键范围:加多个行锁。 普通字段:加表锁。

    77030

    MySQL乐观锁(MySQL乐观锁)

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

    2K10

    MySQL的SELECT …for update

    最近的项目中,因为涉及到Mysql数据中乐观锁和悲观锁的使用,所以结合项目和网上的知识点对乐观锁和悲观锁的知识进行总结。...要使用悲观锁,我们必须关闭mysql数据库的自动提交属性。 set autocommit=0;   //设置完autocommit后,我们就可以执行我们的正常业务了。...补充:MySQL select…for update的Row Lock与Table Lock   上面我们提到,使用select…for update会把数据给锁住,不过我们需要注意一些锁的级别,MySQL...InnoDB默认Row-Level Lock,所以只有「明确」地指定主键,MySQL 才会执行Row lock (只锁住被选取的数据) ,否则MySQL 将会执行Table Lock (将整个数据表单给锁住...select * from person where id>=2 for UPDATE   以上就是关于数据库主键对MySQL锁级别的影响实例,需要注意的是,除了主键外,使用索引也会影响数据库的锁定级别

    4.7K30

    【MySQL】MySQL锁(四)其它锁概念

    MySQL锁(四)其它锁概念 好了,锁相关内容的最后一篇文章了。其实最核心的内容,表锁、行锁、读锁、写锁、间隙锁这些重要的内容我们都已经学习过了,特别是间隙锁,是不是感觉非常复杂。...-- 事务1 mysql> begin; Query OK, 0 rows affected (0.00 sec) mysql> select * from tran_innodb where id...sec) mysql> select * from tran_innodb where id = 17 for update; Empty set (0.00 sec) -- 事务3 mysql>...-- 事务3 mysql> select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from performance_schema.data_locks...悲观锁 悲观锁对数据被其他事务的修改持保守态度,每次拿数据都觉得别人会修改数据,所以别人拿到锁之前都会先上锁,MySQL 中的锁机制就是悲观锁。

    59210

    select for update是行锁还是表锁,还真得看情况

    查看数据库对应的锁: SELECT * FROM performance_schema.data_locks; 注意,在MySQL 8中,采用了performance_schema替代了MySQL5中基于...原因:会出现上述情况的原因是,本来如果锁条件上没有索引,MySQL会走聚簇(主键)索引进行全表扫描过滤,每条记录都会添加上X锁。但为了效率,MySQL会对扫描过程中不满足条件的记录进行解锁操作。...版本 主键 唯一索引 普通索引 无索引 范围查询 MySQL 5.7.x - RR X:行锁 X,行锁 X,GAP:行锁,间隙锁,条件范围内会阻塞 表锁 指定范围加锁,insert阻塞 MySQL 8.0...X锁 指定范围加锁,insert阻塞 MySQL 5.7.x - RC X:行锁 X,行锁 X,行锁,无间隙锁; 行锁 指定范围加锁,更新、insert阻塞 MySQL 8.0.x - RC X,REC_NOT_GAP...(基于RR、RC两种事务隔离级别): 无论哪个版本的MySQL,查询条件为主键、唯一索引、普通索引的情况下,为行锁; 查询条件为普通索引时,事务隔离级别为RR时,MySQL还会添加一个间隙锁,条件内的插入

    1.7K31
    领券