Mysql InnoDB表锁问题

  在讨论问题之前,先看下面的mysql信息

mysql> show status like "%table_lock%";      
+-----------------------+---------+
| Variable_name         | Value   |
+-----------------------+---------+
| Table_locks_immediate | 1290950 | 
| Table_locks_waited    | 1069    | 
+-----------------------+---------+
2 rows in set (0.01 sec)

 

  mysql版本5.0.77, 使用的存储引擎是innodb,而该引擎最主要的特点是transactional和row lock。按理说不会出现表锁才对,但是事实是出现了,并且锁的争用很严重。

 

  查看mysql文档会发现,虽然innodb使用的的row lock,但是在处理具有auto increment字段的表的时候,会使用一种特殊的表锁——AUTO-INC。简单来说就是innodb会在内存里保存一个计数器用来记录auto_increment的值,当插入数据时,就会用一个表锁来锁住这个计数器,直到插入结束。一条一条插入问题不大,但是如果高并发插入,就会造成sql阻塞。

 

  目前已知的解决方法有两种:

  1. 不用auto increment字段,自己维护主键生成。该方法中选择主键生成策略很重要, 要综合考虑简单和效率问题。假设使用uuid,虽然简单但是会造成该表的主键效率很低(innodb的主键是特殊的index,其他的index会引用主键,详见mysql文档)。
  2. 升级到最新的5.1版本。mysql在5.1.22版本以后提供了不同方式的auto-inc配置
innodb_autoinc_lock_mode = 0  (“traditional” lock mode) 

innodb_autoinc_lock_mode = 1  (“consecutive” lock mode) 

innodb_autoinc_lock_mode = 2  (“interleaved” lock mode)

 

  可以参考文档http://dev.mysql.com/doc/refman/5.1/en/innodb-auto-increment-handling.html

  PS:使用复制功能时请详细阅读文档

 

亿佰特E77模块(STM32WLE5CCU6)LoRa通信实战指南:从配置到应用开发 本文详细介绍了亿佰特E77模块(STM32WLE5CCU6)的LoRa通信实战指南,从硬件配置到应用开发。基于ARM Cortex-M4内核的E77模块集成了LoRa射频前端,具备超低功耗和硬件级抗干扰特性,适用于智能农业、工业现场等场景。文章提供了开发环境搭建、LoRa参数配置、实战通信及性能优化等实用技巧,帮助开发者快速掌握LoRa通信技术。 阅读详情

相关推荐

【Docker】常见容器问题解决#OCI runtime create failed: container_linux.go:349: starting container process

ERROR: for nginx Cannot start service nginx: OCI runtime create failed: container_linux.go:349: starting container process caused "process_linux.go:449: container init caused \"rootfs_linux.go:58: mounting \\\"/data/docker-compose/n

liu_chen_yang的博客 5465

MySQL--基础知识点--21--、行,共享,排它,间隙)与避免死

是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的 计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一 个问题冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,对数据库而言显得尤其重要,也更加复杂。本章我们着重讨论MySQL机制 的特点,常见的问题,以及解决MySQL问题的一些方法或建议。 Mysql用到了很多这种机制,比如行等,读,写等,都是在做操作之前

Chasing__Dreams的博客 1587

损失函数大汇总(五十九)(TopoInteraction Loss附公式推导与代码)

本文介绍了TopoInteraction Loss,一种用于多类别分割任务的拓扑交互约束损失函数。不同于传统拓扑损失关注单类别的连通性和孔洞数量,该损失重点约束不同类别之间的空间关系,包括互斥(exclusion)和包含(containment)两种典型拓扑关系。通过将全局拓扑约束转化为局部邻接检测,该损失能准确定位破坏预设拓扑关系的像素,并针对性施加惩罚。关键创新点在于:1)将包含关系转化为互斥约束;2)使用卷积运算高效检测非法邻接;3)仅对违规像素施加损失。实验明,该方法能有效纠正类别间的错误接触,特

悦学共鸣,温柔以待,汇聚光芒,共同成长 323

MySQL汇总,一文搞懂InnoDB所有的

锁住的不是record一行记录,也不是column字段,那么InnoDB的行锁住的到底是什么呢?在上面三个案例中,我们分析一下它们的差异在哪里,这三张结构的什么区别导致了加行为的差异?答案就是索引。InnoDB的行,就是通过锁住索引来实现的。我们准备一张测试t2,中有一个主键索引,有四条数据,主键id分别是1、4、7、10。因为我们用主键索引加,我们这里的划分标准就是主键索引的值。这些数据库里面存在的主键值,我们把它叫做Record,记录,那么我们这里就有4个Record。

秃了也弱了 2790

MYSQLInnodb详解

意向的并发性:意向不会与行的共享/排它互斥,正因为如此,意向并不会影响到多个事务对不同数据行加排它时的并发性(不然直接用普通的就行了)注:意向是有存储引擎自己的维护的,用户无法手动操作意向,在为数据行加共享/排它之前,Innodb会先获取该数据行所载数据对应的意向级别的S、X:在对某个执行增删改查语句的时候,Innodb存储引擎不会为这个添加级别的。3、IX、IS是,不会和行级的X,S发生冲突,只会和级的X,S发生冲突。(Table Lock)

qq_41473691的博客 2551

MySQLInnoDB、行

MySQL

ystzy521的博客 497

MYSQLInnoDB机制详解

B事务:想获得users这张的共享S,此时需要先获得users的IS(前面说过意向之间不会排斥所以可以直接获得),然后继续想要获得这张的S,但是事务A已经获得了该的IX,查知S和IX互斥,B事务:想获得users这张的共享,此时需要先获得users的IS(前面说过意向之间不会排斥所以可以直接获得),然后继续想要获得这张的S,此时事务A已经获得了该的IS,查知S和IS相容,其中idx为普通索引,按照上,(10,20)之间会加上间隙,且40会被锁住,也即[20,40]锁住

m0_63011748的博客 1591

MySQL问题(二)——InnoDB问题

首先补充下MySQL问题(一)没讲到的系统可以通过设置max_write_lock_count参数来控制写的优先级,当一个的读达到这个数的时候,MySQL会暂时的,降低写的优先级.MySQL尽量少用一些看似精妙但复杂的语句,因为你复杂可能导致给加的读时间就长,会导致写的操作无法进行. innodb和MyISAM最大的区别在于innodb支持事务处理和行级,行级带来的好处是可以支

i am a dummy 1万+

MYSQL Innodb 行还是问题探讨

关于mysql行还是,这个问题,今天算是有了一点头绪,mysqlinnodb行的,但是项目中居然出现了死的情况。为什么呢?先看一下这篇文章。        做项目时由于业务逻辑的需要,必须对数据的一行或多行加入行,举个最简单的例子,图书借阅系统。假设 id=1 的这本书库存为 1 ,但是有 2 个人同时来借这本书,此处的逻辑为: Select restnum

零度的博客专栏 8744

剖析MySQL InnoDB引擎的行,怎样利用解决事务并发问题

在正式讲解各种之前,先来预习事务的四种隔离级别,因为MySQL事务隔离级别不同,所用到的也有差别。各种事务隔离级别可以对应解决不同类型的事务并发带来的问题,事务隔离级别越高,可以解决的事务并发问题越多,同时性能事务性能也就越低,所以并非事务隔离级别越高越好。 一、事务并发带来的问题 1、脏读:脏读发生在一个事务A读取了被另一个事务B修改,但是还未提交的数据。假如B回退,则事务A读取的是无效...

wangpf2011的博客 547

mysql效率_Mysql InnoDB问题

在讨论问题之前,先看下面的mysql信息mysql> show status like "%table_lock%";+-----------------------+---------+| Variable_name | Value |+-----------------------+---------+| Table_locks_immediate | 1290950...

weixin_39553705的博客 259

面试问题Mysql InnoDB引擎 行

机制 Mysql分为和行虽然开销小,快,但高并发下性能低。行虽然开销大,慢,但是并发性能高。InnoDB采用的行,支持事务;MyISAM采用不支持事务 InnoDB会变吗? 案例分析: 创建结构 CREATE TABLE `user` ( `ID_` bigint(20) NOT NULL AUTO_INCREMENT, `AGE_` int(11) DEFAULT NULL, `NAME_` varchar(255) DEFAULT NULL, P

jing956899449的博客 1171

MySQL等待超时?5分钟教你用INNODB_TRX快速定位并Kill问题事务

本文针对MySQL等待超时问题,提供了一套从紧急止血到深度根治的实战指南。通过查询INNODB_TRX等系统快速定位阻塞事务,并安全执行KILL操作解除等待。文章深入分析了长事务、缺失索引等根本原因,并给出了监控预警、开发规范与架构优化等系统性预防方案,帮助开发者构建稳健的数据库应用。

android的专栏 756

临键如何实现幻读_剖析MySQL InnoDB引擎的行,怎样利用解决事务并发问题...

在正式讲解各种之前,先来预习事务的四种隔离级别,因为MySQL事务隔离级别不同,所用到的也有差别。各种事务隔离级别可以对应解决不同类型的事务并发带来的问题,事务隔离级别越高,可以解决的事务并发问题越多,同时性能事务性能也就越低,所以并非事务隔离级别越高越好。一、事务并发带来的问题1、脏读:脏读发生在一个事务A读取了被另一个事务B修改,但是还未提交的数据。假如B回退,则事务A读取的是无效的数据。...

weixin_39915668的博客 196

MySQL InnoDB update问题Record Locks

最近做的项目中出现了问题,导致无法进行事务(DML)操作,经过排查发现,我们项目中的购物车有个字段cart_id为uuid类型,并且未设置索引,这里的场景是根据cart_id进行更新内容,Mysql InnoDB不使用索引的时候会整张。 通过命令查询日志找到相关sql语句: show engine innodb status; mysql tables in use 1, locked 1 LOCK WAIT 2 lock struct(s), heap size 11

做技术,贵在学习与坚持! 2685

MySQL引擎类型为InnoDB问题

编程中遇到了org.hibernate.exception.LockTimeoutExceptionCaused by: java.sql.SQLException: Lock wait timeout exceeded; try restarting transactionInnoDB 默认是行,删除和更新会操纵数据会上,查询和插入不会上。如果A事务中要执行的SQL语句,并不能确定数据的主...

wdx1121的博客 315

MySQLInnodb问题_auto_increment

定义: 使用auto_increment的字段可能生成唯一的标识,mysql可以保证这个字段在多进程操作时的原子性; AUTO-INC是当向使用含有AUTO_INCREMENT列的中插入数据时需要获取的一种特殊的; 使用: 可在建时可用“AUTO_INCREMENT=n”选项来指定一个自增的初始值 可用alter table table_name AUTO_INCREMENT...

天生我材必有用,千金散尽还复来。 872

mysql是那个引擎的_【MYSQL】一个关于Innodb存储引擎的加问题

今天有童鞋问了一个关于innodb处理的疑问,于是根据案例做出了分析,见下文:版本Oraclemysql5.5 (GPL)事务隔离级别 REPEATABLE-READ,现在遇到一个很奇怪的问题:现将问题简化:是这样的:show create table a\G*************************** 1. row ***************************Tabl...

weixin_32286661的博客 107
上一篇: exim4 550 relay not permitted的处理
下一篇: HiddenHttpMethodFilter:自动转换Http Method
andyao
博客等级 码龄21年 4粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值