Chinaunix首页 | 论坛 | 博客
  • 博客访问: 352419
  • 博文数量: 166
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1640
  • 用 户 组: 普通用户
  • 注册时间: 2015-05-05 11:44
个人简介

文章不在长,坚持不懈记录下努力前行的脚步

文章分类

全部博文(166)

文章存档

2017年(19)

2016年(59)

2015年(88)

我的朋友

分类: Mysql/postgreSQL

2016-01-28 16:46:38

InnoDB自动检测死锁并回滚一个或者多个事务来防止死锁,InnoDB尝试选择小事务回滚,事务的大小是根据insert,update或者delete影响的行数来判断的。

如果设置innodb_table_locks = 1和autocommit = 0的话,InnoDB识别到表锁定,并且server层也能识别到行级锁,否则的话,由LOCK TABLE语句设置的表锁导致的死锁将不会被检测到。或者InnoDB之外的存储引擎导致的死锁也不能被检测到。可以通过设置innodb_lock_wait_timeout系统变量来解决这些问题。

如果一个InnoDB事务被完整的回滚了的话,事务设置的所有的锁都将被释放,如果单个SQl语句执行发生错误而回滚的话,那么某些锁可能会被保留下来,这是因为以一种方式存储行锁定,在这种方式下,InnoDB不知道向后的锁哪个锁是由哪个SQL造成的。

如果在一个事务中调用了存储函数,而这个函数中的SQL执行失败,那么这个语句就回滚了,如果回滚是在这之后执行,那么整个事务将会被回滚。

为了防止在操作数据库的过程中造成死锁,请看14.2.2.9, “How TO Cope WITH Deadlocks”部分。
阅读(722) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~