mysql中 insert …select …带来的死锁问题
来源:互联网 发布:linux配置防火墙端口 编辑:程序博客网 时间:2024/04/29 16:27
mysql中 insert …select …带来的问题
当使用insert...select...进行记录的插入时,如果select的表是innodb类型的,不论insert的表是什么类型的表,都会对select的表的纪录进行锁定。
对于那些从oracle迁移过来的应用,需要特别的注意,因为oracle并不存在类似的问题,所以在oracle的应用中insert...select...操作非常的常见。例如:有时候会对比较多的纪录进行统计分析,然后将统计的中间结果插入到另外一个表,这样的操作因为进行的非常少,所以可能并没有设置相应的索引。如果迁移到mysql数据库后不进行相应的调整,那么在进行这个操作期间,对需要select的表实际上是进行的全表扫描导致的所有记录的锁定,将会对应用的其他操作造成非常严重的影响。
究其主要原因,是因为mysql在实现复制的机制时和oracle是不同的,如果不进行select表的锁定,则可能造成从数据库在恢复期间插入结果集的不同,造成主从数据的不一致。如果不采用主从复制,关闭binlog并不能避免对select纪录的锁定,某些文档中提到可以通过设置innodb_locks_unsafe_for_binlog来避免这个现象,当这个参数设置为true的时候,将不会对select的结果集加锁,但是这样的设置将可能带来非常严重的隐患。如果使用这个binlog进行从数据库的恢复,或者进行主数据库的灾难恢复,都将可能和主数据库的执行效果不同。
因此,我们并不推荐通过设置这个参数来避免insert...select...导致的锁,如果需要进行可能会扫描大量数据的insert...select操作,我们推荐使用select...into outfile和load data infile的组合来实现,这样是不会对纪录进行锁定的,但是效率会下降
当使用insert...select...进行记录的插入时,如果select的表是innodb类型的,不论insert的表是什么类型的表,都会对select的表的纪录进行锁定。
对于那些从oracle迁移过来的应用,需要特别的注意,因为oracle并不存在类似的问题,所以在oracle的应用中insert...select...操作非常的常见。例如:有时候会对比较多的纪录进行统计分析,然后将统计的中间结果插入到另外一个表,这样的操作因为进行的非常少,所以可能并没有设置相应的索引。如果迁移到mysql数据库后不进行相应的调整,那么在进行这个操作期间,对需要select的表实际上是进行的全表扫描导致的所有记录的锁定,将会对应用的其他操作造成非常严重的影响。
究其主要原因,是因为mysql在实现复制的机制时和oracle是不同的,如果不进行select表的锁定,则可能造成从数据库在恢复期间插入结果集的不同,造成主从数据的不一致。如果不采用主从复制,关闭binlog并不能避免对select纪录的锁定,某些文档中提到可以通过设置innodb_locks_unsafe_for_binlog来避免这个现象,当这个参数设置为true的时候,将不会对select的结果集加锁,但是这样的设置将可能带来非常严重的隐患。如果使用这个binlog进行从数据库的恢复,或者进行主数据库的灾难恢复,都将可能和主数据库的执行效果不同。
因此,我们并不推荐通过设置这个参数来避免insert...select...导致的锁,如果需要进行可能会扫描大量数据的insert...select操作,我们推荐使用select...into outfile和load data infile的组合来实现,这样是不会对纪录进行锁定的,但是效率会下降
0 0
- mysql中 insert …select …带来的死锁问题
- mysql中 insert …select …带来的死锁问题
- mysql中insert...select引发的死锁
- mysql insert into ..select 发生死锁问题。
- MySql自动类型转换 MySql insert into select 带来的问题
- MySQL中INSERT INTO SELECT的使用
- MySQL中INSERT INTO SELECT的使用
- MySQL中INSERT INTO SELECT的使用
- MySQL中INSERT INTO SELECT的使用
- MySQL中INSERT INTO SELECT的使用
- MySQL中INSERT INTO SELECT的使用
- MySQL中INSERT INTO SELECT的使用
- MySQL中INSERT INTO SELECT的使用
- MySQL中INSERT INTO SELECT的使用
- Mysql中INSERT INTO SELECT的使用
- 在MySql中建立存储过程和解决insert into select 中主键冲突的问题
- MYSQL中insert...select优化?
- 【mysql】mysql中insert into select的用法
- Java 锁
- windows平台模拟测试FATFS
- B1031. 查验身份证(15)
- 2017.3.23 信息技术
- 菜鸟的Linux学习史——第五章 简析命令
- mysql中 insert …select …带来的死锁问题
- Hadoop cdh版本分布式集群搭建图文教程
- 删边(normal)
- 3.23课前检测
- table单元格新增行并编辑
- static、extern、const关键字浅析
- 选择结构
- CPP无符号整型减法溢出
- GYM 101086 H.Another Square in the Floor(水~)