谈谈MySql数据库锁

主题: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来处理,这个参数还可以避免大量事务等待锁,而浪费计算机资源。

 

posted @ 2013-11-21 14:36  zzq417  阅读(284)  评论(0编辑  收藏  举报