减少InnoDB死锁发生的方法有什么?MySQL学习

  死锁的情况发生在不同的的事务相互之间拥有对方需要的锁,而导致相互一直无限等待。死锁可能发生在不同的事务都会对多个相同的表和相同的行上施加锁,但事务对表的操作顺序不相同。

  为了减少死锁的发生,要避免使用lock
table语句,要尽量让修改数据的范围尽可能的小和快速;当不同的事务要修改多个表或者大量数据时,尽可能的保证修改的顺序在事务之间要一致。默认情况下InnoDB下的死锁自动侦测功能是开启的,当InnoDB发现死锁时,会将其中的一个事务作为牺牲品回滚。

  通过innodb_lock_wait_timeout参数配置自动侦测功能是否开启,如果关闭的话,InnoDB就会使用innodb_lock_wait_timeout参数来自动回滚等待足够时间的事务。可以通过show
engine innodb status语句查看最后一次发生死锁的情况。

  InnoDB死锁检测和回滚?默认情况下死锁检测功能是开启的,当死锁发生时InnoDB会自动检测到并牺牲其中的一个或者几个事务,以便让其他的事务继续执行下去。InnoDB选择牺牲的事务往往是代价比较小的事务,其代价计算是根据事务insert,update,
delete的数据行规模决定。如果事务中的某个语句因为错误而回滚,则这个语句上的锁可能还会保留,是因为InnoDB仅会存储行锁信息,而不会存储行锁是由事务中的哪个语句产生的。如果在一个事务中,select语句调用了函数,而函数中的某个语句执行失败,则那个语句会回滚,如果在整个事务结束时执行rollback,则整个事务回滚。可以通过innodb_deadlock_detect
参数关闭死锁检测功能,而仅仅用innodb_lock_wait_timeout的功能来释放锁等待 。

  那么,减少死锁发生的方法有什么呢?

  在事务性数据库中,死锁是个经典的问题,但只要发生的频率不高则死锁问题不需要太过担心。查看死锁的方法有两种:1.通过show engine innodb
status命令可以查看最后一个死锁的情况。2.通过innodb_print_all_deadlocks参数配置可以将所有死锁的信息都打印到MySQL的错误日志中。

  减少死锁发生的方法:1.尽可能的保持事务小型化,减少事务执行的时间可以减少发生影响的概率;2.及时执行commit或者rollback,来尽快的释放锁;3.可以选用较低的隔离级别,比如如果要使用select...for
update和select...lock in share
mode语句时可以使用读取提交数据隔离级别;4.当要访问多个表数据或者要访问相同表的不同行集合时,尽可能的保证每次访问的顺序是相同的。比如可以将多个语句封装在存储过程中,通过调用同一个存储过程的方法可以减少死锁的发生。

  互联网企业大多用的数据库是MySQL的,想要众多的IT工作者中脱颖而出,就需要拥有高深的技术,学习增值是必不可少的。学习之路,是贵在坚持的。老男孩教育MySQL
DBA课程,几经更新课程,杜绝纸上谈兵,全企业真实案例结合理论授课,想深入的学习MySQL DBA的知识,可以关注下老男孩教育。

原文地址:http://blog.51cto.com/13543192/2119575

时间: 2024-10-01 10:36:48

减少InnoDB死锁发生的方法有什么?MySQL学习的相关文章

Oracle常见死锁发生的原因以及解决方法

Oracle常见死锁发生的原因以及解决办法 一,删除和更新之间引起的死锁 造成死锁的原因就是多个线程或进程对同一个资源的争抢或相互依赖.这里列举一个对同一个资源的争抢造成死锁的实例. Oracle 10g, PL/SQL version 9.2 CREATE TABLE testLock(  ID NUMBER, test VARCHAR(100)  ) COMMIT INSERT INTO testLock VALUES(1,'test1'); INSERT INTO testLock VAL

【操作系统-死锁】死锁发生的条件是什么?死锁的避免和预防方法

digest:本文章简要概述操作系统死锁的原因以及预防和解决方法. 1.死锁的定义 死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种进程间相互阻塞的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程.                                                                ——汤小丹等.<计算机操作系统>:西安电子科技大学出版社,2012.

SQL Server中解决死锁的新方法介绍

SQL Server中解决死锁的新方法介绍 数据库操作的死锁是不可避免的,本文并不打算讨论死锁如何产生,重点在于解决死锁,通过SQL Server 2005, 现在似乎有了一种新的解决办法. 将下面的SQL语句放在两个不同的连接里面,并且在5秒内同时执行,将会发生死锁. <ccid_nobr> <ccid_code>use Northwindbegin tran insert into Orders(CustomerId) values(@#[email protected]#)

Update导致SQL Server死锁的典型方法(转载)

此文为转载文章,描述的很好,没有验证过. 最近遇到了一个看上去很奇怪,分析起来很有意思的死锁问题.这个死锁看上去难以理解.而分析过程中,又使用了很多分析SQL Server死锁的典型方法.记录下来整个分析过程还是很有意义的. 问题重现步骤: 经过提炼,问题重现的步骤非常简单,在SQL 2008上可以很容易地重现. 1.         首先,创建一张表格,上面有一个clustered index,两个non-clustered index. create table tt(id int iden

一个 Linux 上分析死锁的简单方法

转自:https://www.ibm.com/developerworks/cn/linux/l-cn-deadlock/ 简介 死锁 (deallocks): 是指两个或两个以上的进程(线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程(线程)称为死锁进程(线程). 由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程(线程)在无外力协助下,永远分配不到必需的资源而无法继续运行,

关于数据库死锁的检查方法

关于数据库死锁的检查方法 一.        数据库死锁的现象程序在执行的过程中,点击确定或保存按钮,程序没有响应,也没有出现报错. 二.        死锁的原理当对于数据库某个表的某一列做更新或删除等操作,执行完毕后该条语句不提交,另一条对于这一列数据做更新操作的语句在执行的时候就会处于等待状态,此时的现象是这条语句一直在执行,但一直没有执行成功,也没有报错. 三.        死锁的定位方法通过检查数据库表,能够检查出是哪一条语句被死锁,产生死锁的机器是哪一台.1)用dba用户执行以下语

MySql中启用InnoDB数据引擎的方法

1.存储引擎是什么? Mysql中的数据用各种不同的技术存储在文件(或者内存)中.这些技术中的每一种技术都使用不同的存储机制.索引技巧.锁定水平并且最终提供广泛的不同的功能和能力.通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能.这些不同的技术以及配套的相关功能在MySQL中被称作存储引擎(也称作表类型).MySql默认配置了许多不同的存储引擎,可以预先设置或者在MySql服务器中启用. 2.MYSQL支持的数据引擎 MyISAM:默认的MySQL插件式存储引擎,它是

Nubia Z5S官方4.4 UI2.0音频Audio部分简单分析(也适用于其他8974/8064机型)以及减少破音出现几率的方法

转载请注明出处和网址链接: http://blog.csdn.net/syhost/article/details/31419749 此篇本是在Z5S的官方4.4内测版出来时写的, 主要是看到其在audio的配置文件里没有es325的相关配置, 因此断定不支持z5sn的一些audio特性,本想喷一下, 结果第二天官方自己写了.. 本人先前在安智论坛也发过一篇通过修改snd_soc_msm的audio配置文件来调整一些音量的方法, 但本人4月之后编译的Z5S的Android4.4的ROM已经采用了

mysql myisam转innodb的2种方法

mysql myisam转innodb的2种方法 mysql中的myisam和innodb有什么区别.一个好比便利店,一个好比大型购物中心,他们是为了适应不同的场合而存在的.当流量比较小,我们可以用myisam,当流量大时,我们可能会把数据库中的,全部表或者部分表转换成innodb.下面说2种切实可行的方法来完成这种转换. 一,用alter table来实现. mysql> alter table merchant engine=innodb; 转换方法很简单.myisam在磁盘上的储存有三个文