Mysql 锁
myISAM和MEMORY存储引擎采用的是表级锁table-level locking
死锁
所谓死锁<DeadLock>: 是指两个或两个以上的进程在执行过程中,
因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.
此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等竺的进程称为死锁进程.
表级锁不会产生死锁.所以解决死锁主要还是真对于最常用的InnoDB.
在遇到问题时
先执行show processlist找到死锁线程号.然后Kill processNo
当然主要解决还是需要去看一下具体的操作.可能产生死锁
Show innodb status检查引擎状态 ,可以看到哪些语句产生死锁
SHOW PROCESSLIST查看数据库中表的状态,是否被锁;
kill id //杀掉被锁的表
innodb的锁实现
innodb 行锁是通过给索引上的索引项加锁来实现的,这一点MySQL与Oracle不同。
Oracle是通过在数据块中对相应的数据行加锁来实现的。
而innodb则是只有通过索引调价检索数据,innodb才使用行锁,否则,innodb将使用表锁
(1)在不通过索引条件查询的时候,innodb确实使用的是表锁,而不是行锁
(2)由于行锁是针对索引加的锁,不是针对记录加的锁,所以,虽然访问不同行的记录,
但是如果是使用相同的索引键,是会出现锁冲突
(3)当表有多个索引的时候,不同的事务可以使用不同的索引锁定不同的行,
另外,无论是使用主键索引、唯一索引或普通索引,innodb都会使用行锁来对数据加锁
(4)即便条件中使用了索引字段,但是是否使用索引来检索数据是由MySQL通过判断不同
的执行代价来决定的,
如果MySQL认为全表扫描效率高,比如对一些很小的表,他就不使用索引
这时候,使用表锁,而不是行锁。
浙公网安备 33010602011771号