数据库死锁分析
2015-08-06 18:30
337 查看
首先,来分析一下数据库死锁的原因:数据库有很多种存储引擎,前面的博文中也分析过。前面主要讲了MyISAM和InnoDB这两种引擎,每种引擎对于锁的机制是不同的。而前面也曾提及,MyISAM存储引擎是不会出现死锁情况的,在这里我们主要讨论的是InnoDB存储引擎出现死锁的原因。
那么为什么MyISAM中不会出现死锁呢?我自己思考了一下,可能有以下原因,讲述的可能不正确,大家借鉴思考吧!首先,MyISAM数据库不支持事务,每一条SQL语句都是独立的一个执行结果,获得锁释放锁。不会说第一条语句到第二条语句还没有释放。而mysql中的表级锁是自动添加的,而且,MyISAM每次会为sql语句的执行一次性获取所有的锁或者等待。不存在持有一个锁等待另一个锁的情况。所以,根本不会出现死锁的情况。
理解了MyISAM不会产生死锁的原因后,对于理解InnoDB为什么会死锁有很大的帮助。InnoDB中有事务,而每条sql语句获取的锁是在事务提交的时候才释放。所以,就会存在一种情况:事务一获取了表一中的锁,事务二获取了表二中的锁,事务一等待表二的锁,事务二等待表一的锁。这种情况下,就会造成死锁。
发生死锁后,InnoDB一般都能够自动检测到,并是一个事物释放锁并回退,另一个事务获得锁,继续完成事务。可以设置锁等待超时参数。
通常来说,死锁都是应用设计的问题。通过调整业务流程等能够一定程度上避免死锁。下面介绍几种书上介绍的方法:
(1)尽量使用相同的顺序访问表,可以大大降低死锁的机会。
(2)在事务中,如果要更新记录,应该一次性申请足够的锁,即排它锁。
以上是个人的理解,理解的很片面
那么为什么MyISAM中不会出现死锁呢?我自己思考了一下,可能有以下原因,讲述的可能不正确,大家借鉴思考吧!首先,MyISAM数据库不支持事务,每一条SQL语句都是独立的一个执行结果,获得锁释放锁。不会说第一条语句到第二条语句还没有释放。而mysql中的表级锁是自动添加的,而且,MyISAM每次会为sql语句的执行一次性获取所有的锁或者等待。不存在持有一个锁等待另一个锁的情况。所以,根本不会出现死锁的情况。
理解了MyISAM不会产生死锁的原因后,对于理解InnoDB为什么会死锁有很大的帮助。InnoDB中有事务,而每条sql语句获取的锁是在事务提交的时候才释放。所以,就会存在一种情况:事务一获取了表一中的锁,事务二获取了表二中的锁,事务一等待表二的锁,事务二等待表一的锁。这种情况下,就会造成死锁。
发生死锁后,InnoDB一般都能够自动检测到,并是一个事物释放锁并回退,另一个事务获得锁,继续完成事务。可以设置锁等待超时参数。
通常来说,死锁都是应用设计的问题。通过调整业务流程等能够一定程度上避免死锁。下面介绍几种书上介绍的方法:
(1)尽量使用相同的顺序访问表,可以大大降低死锁的机会。
(2)在事务中,如果要更新记录,应该一次性申请足够的锁,即排它锁。
以上是个人的理解,理解的很片面
相关文章推荐
- linux oracle10g命令行创建数据库实例
- maven项目中加载oracle驱动
- MySql常用命令总结
- Mysql数据库设计
- mongodb初学-java操作mongodb
- ERROR 2003 (HY000): Can't connect to MySQL server on '10.16.115.101' (111)
- mysql left right inner join的用法
- SQL查询的时候可自带循环
- ARCGIS ORACLE
- LVS+keepalived+DRBD+heartbeat+mysql
- jndi连接数据库配置过程总结
- Oracle中的NVL函数
- mongodb常见管理命令
- mongodb高可用Replica Set
- oracle 根据约束名查表名
- mongodb增删改查
- 脚本实现mysql周完全备份所有库
- mongodb入门安装
- java使用Redis7--分布式存储并实现sentinel主从自动切换
- mongodb初学-常用基本命令