主题:MySql有哪些锁;如何运用这些锁;避免死锁
innodb的锁可分为共享锁、排他锁。亦可分为行锁、表锁、间隙锁。
innodb的行锁是通过给索引的索引项加锁来实现的,包括聚簇索引、唯一索引、普通索引等。而Oracle则不同,是通过给数据块的行加锁来实现。
间隙锁(next key锁),innodb使用范围条件查找,并请求共享或排他锁时,innodb还会给所有在条件内但不存在的记录加间隙锁。使用相等条件查找,也会给不存在的记录加间隙锁。这将影响并发插入
使用表锁:
1)更新表的大部分数据,表比较大。
2)涉及多表,比较复杂,为了避免死锁以及导致的回滚
Set autocommit = 0;lock tables commit unlock tables
innodb死锁
由于innodb的锁是逐步获得的,所以可能出现死锁
1)使用了相同的索引键(非唯一、聚簇索引),即使访问不同的record,也会造成锁冲突
2)使用了不同的索引访问相同的record,也会锁阻塞、
3)事务以不同的顺序并发访问record,造成互相锁等待
innodb一般能检测到死锁,并是一个事务释放锁并回滚,另一个事务获得锁,继续完成。涉及外部锁,表锁的情况下,不一定能检测到。这就需要设置innodb_lock_wait_timeout来处理,这个参数还可以避免大量事务等待锁,而浪费计算机资源。