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”部分。
阅读(758) | 评论(0) | 转发(0) |