什么是锁

锁是计算机用以协调多个进程间并发访问同一共享资源的一种机制。 MySQL中为了保证数据访问的一致性与有效性等功能,实现了锁机制,MySQL中的锁是在服务器层或者存储引擎层实现的。

为什么要了解锁

在数据库中,如果多个事务同时对一个数据进行操作,并发的操作若不加控制,可能会读取和存储不正确的数据,破坏数据库的一致性、脏读、不可重复读、幻读等、甚至可能产生死锁。 如何保证数据并发访问的一致性,有效性,是所有数据库必须要解决的问题。 锁冲突也是影响数据库并发访问性能的一个重要因素,因此锁对数据库尤其重要。

但是,加锁是消耗资源的,锁的各种操作,包括获得锁、检测锁是否已解除、释放锁等 ,都会增加系统的开销。

锁类型

我们以一个例子来说明各种锁类型。 在电商系统中,用户下单后商品的库存对应减少,在高并发情况下(秒杀)需保证数据一致性(最终库存量与减库存时库存量一致)。

悲观锁

每次在拿数据的时候都会上锁,保证同一时刻只有一个线程能操作数据,其它线程处于等待状态。

乐观锁

每次取数据时不会上锁,但是在提交更新的时候会判断一下在此期间有没别人更新了这个数据。乐观锁适用于读多写少的应用场景,这样可以提高吞吐量。 乐观锁一般来说有两种方式: 1. 使用数据版本(version)记录机制实现 2. 使用时间戳(timestamp)

分布式锁

目前常见分布式锁实现有两种:基于Redis和基于Zookeeper。这个后面再写