`

20.3.9 关于死锁 深入浅出MySQL——数据库开发、优化与管理维护

阅读更多

深入浅出MySQL——数据库开发、优化与管理维护

回书目   上一节   下一节

 

20.3.9 关于死锁

http://book.51cto.com  2008-03-27 23:07  唐汉明 翟振兴 兰丽华 关宝军 申宝柱  人民邮电出版社  我要评论(0)
  • 摘要:《深入浅出MySQL——数据库开发、优化与管理维护》从数据库的基础、开发、优化、管理4方面对MySQL进行了详细的介绍,其中每一部分都独立成篇,每一篇又包括多个章节。本书面向实用,内容覆盖广泛,讲解由浅入深,适合于各个层次的读者。本文介绍了InnoDB锁。
  • 标签:MySQL  数据库  InnoDB

 

20.3.9 关于死锁

上文讲过,MyISAM表锁是deadlock free的,这是因为MyISAM总是一次获得所需的全部锁,要么全部满足,要么等待,因此不会出现死锁。但在InnoDB中,除单个SQL组成的事务外,锁是逐步获得的,这就决定了在InnoDB中发生死锁是可能的。如表20-17所示的就是一个发生死锁的例子。

表20-17           InnoDB存储引擎中的死锁例子

 

session_1

 

session_2

 

mysql> set autocommit = 0;

Query OK, 0 rows affected (0.00 sec)

 

mysql> select * from table_1 where where id=1 for update;

...

做一些其他处理...

mysql> set autocommit = 0;

Query OK, 0 rows affected (0.00 sec)

 

mysql> select * from table_2 where id=1 for update;

...

 

select * from table_2 where id =1 for update;

session_2已取得排他锁,等待

做一些其他处理...

 

 

 

 

 

mysql> select * from table_1 where where id=1 for update;

死锁

 

在上面的例子中,两个事务都需要获得对方持有的排他锁才能继续完成事务,这种循环锁等待就是典型的死锁。

发生死锁后,InnoDB一般都能自动检测到,并使一个事务释放锁并回退,另一个事务获得锁,继续完成事务。但在涉及外部锁,或涉及表锁的情况下,InnoDB并不能完全自动检测到死锁,这需要通过设置锁等待超时参数innodb_lock_wait_timeout来解决。需要说明的是,这个参数并不是只用来解决死锁问题,在并发访问比较高的情况下,如果大量事务因无法立即获得所需的锁而挂起,会占用大量计算机资源,造成严重性能问题,甚至拖跨数据库。我们通过设置合适的锁等待超时阈值,可以避免这种情况发生。

通常来说,死锁都是应用设计的问题,通过调整业务流程、数据库对象设计、事务大小,以及访问数据库的SQL语句,绝大部分死锁都可以避免。下面就通过实例来介绍几种避免死锁的常用方法。

(1)在应用中,如果不同的程序会并发存取多个表,应尽量约定以相同的顺序来访问表,这样可以大大降低产生死锁的机会。在下面的例子中,由于两个session访问两个表的顺序不同,发生死锁的机会就非常高!但如果以相同的顺序来访问,死锁就可以避免。

表20-18  InnoDB存储引擎中表顺序造成的死锁例子

 

session_1

session_2

mysql> set autocommit=0;

Query OK, 0 rows affected (0.00 sec)

mysql> set autocommit=0;

Query OK, 0 rows affected (0.00 sec)

mysql> select first_name,last_name from actor where actor_id = 1 for update;

+------------+-----------+

| first_name | last_name |

+------------+-----------+

| PENELOPE   | GUINESS   |

+------------+-----------+

1 row in set (0.00 sec)

 

 

mysql> insert into country (country_id,country) values(110,'Test');

Query OK, 1 row affected (0.00 sec)

mysql>  insert into country (country_id,country) values(110,'Test');

等待

 

 

mysql> select first_name,last_name from actor where actor_id = 1 for update;

+------------+-----------+

| first_name | last_name |

+------------+-----------+

| PENELOPE   | GUINESS   |

+------------+-----------+

1 row in set (0.00 sec)

mysql>  insert into country (country_id,country) values(110,'Test');

ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction

 

 

(2)在程序以批量方式处理数据的时候,如果事先对数据排序,保证每个线程按固定的顺序来处理记录,也可以大大降低出现死锁的可能。

表20-19  InnoDB存储引擎中表数据操作顺序不一致造成的死锁例子

 

session_1

session_2

mysql> set autocommit=0;

Query OK, 0 rows affected (0.00 sec)

mysql> set autocommit=0;

Query OK, 0 rows affected (0.00 sec)

mysql> select first_name,last_name from actor where actor_id = 1 for update;

+------------+-----------+

| first_name | last_name |

+------------+-----------+

| PENELOPE   | GUINESS   |

+------------+-----------+

1 row in set (0.00 sec)

 

 

mysql> select first_name,last_name from actor where actor_id = 3 for update;

+------------+-----------+

| first_name | last_name |

+------------+-----------+

| ED         | CHASE     |

+------------+-----------+

1 row in set (0.00 sec)

mysql> select first_name,last_name from actor where actor_id = 3 for update;

等待

 

 

mysql> select first_name,last_name from actor where actor_id = 1 for update;

ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction

mysql> select first_name,last_name from actor where actor_id = 3 for update;

+------------+-----------+

| first_name | last_name |

+------------+-----------+

| ED         | CHASE     |

+------------+-----------+

1 row in set (4.71 sec)

 

分享到:
评论

相关推荐

    mysql死锁的一些案例

    MySQL数据库在处理并发事务时,可能会遇到一种特殊的情况,即死锁。死锁是指两个或多个事务在执行过程中,因争夺资源而造成的一种相互等待的现象,若无外力干涉它们将无法继续执行。死锁是数据库系统中常见的问题,...

    otp_win64_20.3-Erlang.zip

    标题中的"otp_win64_20.3-Erlang.zip"表明这是一个包含Erlang编程语言特定版本的Windows 64位版本的压缩...此外,Erlang OTP还包括了各种实用工具,如编译器、调试器和性能监视工具,以支持开发和维护Erlang应用程序。

    KKDiveIntoMysqlBook:深度浅出MySQL数据库开发优化与管理维护第2版唐汉明原始码-mysql

    《KKDiveIntoMysqlBook》是一本深入浅出探讨MySQL数据库开发、优化与管理维护的书籍,由知名作者唐汉明编著。该书的第2版提供了更全面、更新的知识点,旨在帮助读者更好地理解和应用MySQL。开源的性质使得这本书的...

    MYSQL 数据库死锁

    了解和处理死锁是数据库管理员和开发人员必备的技能。下面我们将深入探讨MySQL中的InnoDB存储引擎如何处理死锁,以及如何通过实际例子来理解这个问题。 首先,InnoDB存储引擎是MySQL中默认的事务型存储引擎,它支持...

    何登成 - 管中窥豹——MySQL(InnoDB)死锁分析之道

    在实际中,解决MySQL(InnoDB)的死锁问题需要深入了解死锁产生的原因、锁的类型以及加锁策略,进而对业务逻辑进行优化或调整数据库配置和代码逻辑以减少死锁的可能性。 ### 个人简介 何登成作为阿里巴巴DBA团队的...

    mysql数据库性能优化

    ### MySQL数据库性能优化 #### 一、概览 在当今高度依赖互联网技术的世界里,数据库作为数据存储的核心组件,其性能直接影响着应用系统的响应速度和用户体验。MySQL作为一款广泛使用的开源关系型数据库管理系统,...

    《MySQL数据库原理及应用》教案.rar

    《MySQL数据库原理及应用》是一门深入探讨关系型数据库管理系统MySQL的课程,旨在教授学生如何设计、创建和管理数据库,以及如何在实际应用场景中高效利用MySQL。教案详细涵盖了该课程的所有章节,为教学提供了全面...

    mysql学习用数据库dbt3

    MySQL是世界上最受欢迎的开源关系型数据库管理系统之一,广泛应用于各种规模的企业、网站和应用程序中。DBT3(Decision Bench for TPC-T Benchmark)是针对数据库性能评估的一个基准测试套件,它模拟了复杂的决策...

    MySQL数据库原理及设计方法.pdf

    MySQL数据库是一种广泛使用的开源关系型数据库管理系统,其原理和设计方法是数据库管理员和开发者必须掌握的基础知识。本文将深入探讨MySQL的逻辑架构、并发控制、事务处理等方面。 首先,MySQL的逻辑架构分为三层...

    sql数据库死锁查询工具

    总之,理解和使用sql数据库死锁查询工具是数据库管理员日常维护工作的重要部分。通过有效的监控、诊断和解决方法,可以显著提高数据库的稳定性和性能。对于企业来说,确保数据库健康运行是保障业务连续性和数据安全...

    全国计算机三级——数据库技术分章节考试要点总结

    全国计算机三级——数据库技术是针对计算机专业知识的一项重要考核,涵盖了数据管理、数据库设计、SQL语言、数据库系统原理、数据库安全等多个关键领域。本考试要点总结旨在帮助考生高效备考,掌握核心知识点,确保...

    查看数据库死锁信息

    在数据库管理中,死锁是一个常见的问题,尤其是在高并发的环境中。死锁指的是两个或多个事务在执行过程中,因争夺资源而造成的一种相互等待的现象,若无外力干涉它们将无法继续执行。本篇文章将详细讲解如何查看和...

    大牛出手MySQL死锁深入分析

    MySQL死锁问题是数据库管理员和开发者在工作中经常遇到的一种并发问题,尤其在面试中也常作为考核候选人的一个知识点。本文将以一个具体的死锁案例为背景,深入分析MySQL中的死锁机制,探讨死锁的成因,并提出预防...

    循序渐进Oracle----数据库管理、优化与备份恢复.pdf

    《循序渐进Oracle——数据库管理、优化与备份恢复》这一资源聚焦于Oracle数据库的核心管理技术,涵盖了数据库的日常管理、性能优化以及备份与恢复的关键知识点。以下是对这些主题的详细解析,旨在帮助读者深入理解...

    MySQL开发实战:电子商务订单系统数据库开发的实验心得与案例解析

    ### MySQL开发实战:电子商务订单系统数据库开发的知识点详解 #### 一、MySQL基本特性与重要性 MySQL作为全球最流行的开源关系型数据库管理系统之一,在各类应用程序中占据着举足轻重的地位,无论是在小型个人项目...

    MySQL数据库基础与实例教程所有资源

    MySQL数据库是一种广泛使用的开源关系型数据库管理系统,以其高效、可靠和易于学习的特性深受开发者喜爱。本教程将全面介绍MySQL的基础知识,并通过实例帮助你掌握其核心操作。 首先,我们来了解一下MySQL的基本...

    【整理】数据库面试题索引sql优化+数据库SQL优化总结之百万级数据库优化

    7. **数据库维护与优化**:定期的维护任务如更新统计信息、重建索引、清理无用数据,以及数据库参数调优,都对性能有显著影响。 最后,"Oracle高性能sql优化"可能提供了Oracle数据库特有的优化技术,例如: 1. **...

Global site tag (gtag.js) - Google Analytics