mysql线上问题

* 问题

       Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction
       出现这种问题是因为有执行的sql语句被锁住了。


* 处理过程

       1.先查看正在跑着的sql进程:

show full processlist;

       2.查询sql进程运行的状态:

select * from information_schema.INNODB_trx;

在这里插入图片描述

       现在没有内容==,如果出现被锁的sql进程,他的状态为 lock wait

       3. kill lock_id 杀死锁住的进程。


* 分析

       为什么会出现锁?出现锁表的情况我们要如何做?如何避免锁表?这些是我应该要思考的问题。不同的引擎支持不同的锁机制,通过上面的问题分析,也了解到我们用到的锁引擎是INNODB
       数据是一种供许多用户共享访问的资源,保证数据并发访问的一致性、有效性是我们使用数据库必须要解决的一个问题,所得冲突也是影响数据库并发访问性的一个重要因素。

3.1 mysql 锁

行锁 表锁 页锁
MyISAM
BDB
InnoDB
  • 表锁:开销小,加锁快;不会出现死锁;锁定力度大,发生锁冲突概率高,并发度最低
  • 行锁:开销大,加锁慢;会出现死锁;锁定粒度小,发生锁冲突的概率低,并发度高
  • 页锁:开销和加锁速度介于表锁和行锁之间;会出现死锁;锁定粒度介于表锁和行锁之间,并发度一般

       BDB已经被InnoDB取代,我们不在讨论他。行锁:试用于大量按索引条件并发,更新少量不同的数据,同时又并发查询的应用。

3.2 表锁-when

       对于InnoDB表,在大部分情况下应该使用行级锁,这是我们选择该引擎的原因,但在个别特殊事物中,也可以考虑使用表级锁。

  • 第一种情况是:事务需要更新大部分或全部数据,表又比较大,如果使用默认的行锁,不仅这个事务执行效率低,而且可能造成其他事务长时间锁等待和锁冲突,这种情况下可以考虑使用表锁来提高该事务的执行速度。

  • 第 二种情况是:事务涉及多个表,比较复杂,很可能引起死锁,造成大量事务回滚。这种情况也可以考虑一次性锁定事务涉及的表,从而避免死锁、减少数据库因事务回滚带来的开销。

3.2 避免死锁

       基于目前的知识十分有限,对于避免死锁出现,小编的认识是对sql语句进行优化,合理的构建索引,当然这些可以减少死锁,但是却不能避免。


* 结语

       写这篇博客时自己是蛮痛苦的,因为对锁的知识,自己是一知半解的,同时自己还缺乏下面的了解:数据库中的事物,锁的级别和类型。不由得让我想起来了得到中的一篇文章,一个人的能力由三条线构成的,第一条是自己的知识积累量,我们的创新创造都依赖它,第二条是我们在原有的知识上有了自己的想法,有了启发,第三条是我们自己知识产物,这个时候我想已经成为大家了。

       未完待续,后续小编会持续学习数据库方面的知识,感谢您的阅读~
mysql线上问题_第1张图片

你可能感兴趣的:(✿,计算机,——【JAVA】)