关于mysql:MySql锁机制

2次阅读

共计 1007 个字符,预计需要花费 3 分钟才能阅读完成。

从对数据操作的粒度分:

1)表锁:操作时,会锁定整个表。

2)行锁:操作时,会锁定以后操作行。

从对数据操作的类型分:

1)读锁(共享锁):针对同一份数据,多个读操作能够同时进行而不会相互影响。

2)写锁(排它锁):以后操作没有实现之前,它会阻断其余写锁和读锁。

表级 锁更适宜于以查问为主,只有大量按索引条件更新数据的利用,如 Web 利用;而行级锁则更适宜于有大量按索引 条件并发更新大量不同数据,同时又有并查问的利用,如一些在线事务处理(OLTP)零碎。

1)对 MyISAM 表的读操作,不会阻塞其余用户对同一表的读申请,但会阻塞对同一表的写申请;

2)对 MyISAM 表的写操作,则会阻塞其余用户对同一表的读和写操作;

简而言之,就是读锁会阻塞写,然而不会阻塞读。而写锁,则既会阻塞读,又会阻塞写。此外,MyISAM 的读写锁调度是写优先,这也是 MyISAM 不适宜做写为主的表的存储引擎的起因。因为写锁后,其余线程不能做任何操作,大量的更新会使查问很难失去锁,从而造成永远阻塞。

行锁介绍 行锁特点:偏差 InnoDB 存储引擎,开销大,加锁慢;会呈现死锁;锁定粒度最小,产生锁抵触的概率最低, 并发度 也最高。InnoDB 与 MyISAM 的最大不同有两点:一是反对事务;二是 采纳了行级锁。

InnoDB 实现了以下两种类型的行锁。共享锁(S):又称为读锁,简称 S 锁,共享锁就是多个事务对于同一数据能够共享一把锁,都能拜访到数 据,然而只能读不能批改。排他锁(X):又称为写锁,简称 X 锁,排他锁就是不能与其余锁并存,如一个事务获取了一个数据行的排他 锁,其余事务就不能再获取该行的其余锁,包含共享锁和排他锁,然而获取排他锁的事务是能够对数据就行 读取和批改。对于 UPDATE、DELETE 和 INSERT 语句,InnoDB 会主动给波及数据集加排他锁(X);对于一般 SELECT 语句,InnoDB 不会加任何锁;

如果不通过索引条件检索数据,那么 InnoDB 将对表中的所有记录加锁,实际效果跟表锁一样。

优化倡议:

尽可能让所有数据检索都能通过索引来实现,防止无索引行锁降级为表锁。

正当设计索引,尽量放大锁的范畴 尽可能减少索引条件,及索引范畴,防止间隙锁

尽量管制事务大小,缩小锁定资源量和工夫长度

尽可应用低级别事务隔离(然而须要业务层面满足需要)

mysql 执行程序

FROM ON JOIN WHERE GROUP BY HAVING SELECT DISTINCT ORDER BY LIMIT

正文完
 0