无论何时,只要有多个查询需要在同一时刻修改数据,都会产生并发控制的问题。

在处理并发读或者写的时候,可以通过实现一个由两种类型的锁组成的锁系统来解决问题。这两种类型的锁通常被称为共享锁和排他锁,也叫读锁和写锁。

读锁是共享的,或者说是相互不阻塞的。多个客户在同一时刻可以同时读取同一个资源而不互相干扰。

写锁是排他的,也就是说一个写锁会阻塞其他的写锁和读锁,这是出于安全策略的考虑,只有这样才能保证在给定时间里,只有一个用户执行写入。

尽量只锁定需要修改的部分数据,而不是所有的资源。更理想的方式是只对会修改的数据片进行精确的锁定。任何时候在给定的资源上,锁定的数据量越少,则系统的并发程度越高,只要相互不发生冲突即可。

加锁需要耗费资源,包括获取锁、检查锁是否解除、释放锁等等都会增加系统开销。

所谓锁策略,就是在锁的开销和数据安全性之间寻求平衡。

表锁是MySQL中最基本的锁策略,并且是开销最小的策略。它会锁定整张表,一个用户在对表进行写操作前,需要先获取写锁,这回阻塞其他用户对该表的所有读写操作。只有没有写锁时,其他读取的用户才能获取读锁,读锁之间是不相互阻塞的。另外,写锁比读锁优先级高,因此一个写锁请求可能会插入到读锁队列的前面。

行级锁可以最大程度地支持并发处理(同时带来了最大的锁开销)。行级锁只在存储引擎层实现,而MySQL服务层没有实现。

 

 

----《高性能MySQL》