概述: (1)普通的select都是快照查询,不加锁 (2)insert加gap锁,update和delete根据条件, <1>不走索引,则全表扫描,符合条件的记录都加锁(主键索引上加锁) <2>走索引,则索引上符合条件的记录加锁,如果不是主键索引,则在对应的主键索引上也加锁。
死锁发生: <1>两个地方,加锁顺序相反,导致互相锁死。 <2>一个地方,或多个地方,给记录加锁顺序相反,互相锁死。 如一个sql给1,3记录加锁,另一个sql给3,1记录加锁,互相锁死。 如前者走主键索引,符合条件的记录是1和3,顺序加锁。 后者走其他索引,也要给主键索引上锁,顺序是3和1,互相锁死。 ---------------------------- (1)InnoDB行锁是通过给索引上的索引项加锁来实现的,这一点MySQL与Oracle不同,后者是通过在数据块中对相应数据行加锁来实现的。InnoDB这种行锁实现特点意味着:只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁!
(2)由于MySQL的行锁是针对索引加的锁,不是针对记录加的锁,所以虽然是访问不同行的记录,但是如果是使用相同的索引键,是会出现锁冲突的。应用设计的时候要注意这一点。
(3)当表有多个索引的时候,不同的事务可以使用不同的索引锁定不同的行,另外,不论是使用主键索引、唯一索引或普通索引,InnoDB都会使用行锁来对数据加锁。
(4)即便在条件中使用了索引字段,但是否使用索引来检索数据是由MySQL通过判断不同执行计划的代价来决定的,如果MySQL认为全表扫描效率更高,比如对一些很小的表,它就不会使用索引,这种情况下InnoDB将使用表锁,而不是行锁。因此,在分析锁冲突时,别忘了检查SQL的执行计划,以确认是否真正使用了索引。关于MySQL在什么情况下不使用索引的详细讨论,参见本章“索引问题”一节的介绍。
另一个好文,很详细。 mysql事务和锁InnoDB http://www.cnblogs.com/zhaoyl/p/4121010.html
|