是一种逻辑概念,是并发控制中常用的两种锁机制。
- 乐观锁是要修改数据的时候,才检测数据释放已经被别人修改过
- 悲观锁是在初始时刻就直接加锁保护好临界资源
乐观锁在数据库里通常利用CAS的思路进行更新操作,一般的使用形态如下:
SELECT * FROM your_tab WHERE id = 1; // 在这里拿到了 a = 1
// 一大堆的业务操作
UPDATE your_tab SET a = 3, b = 4 WHERE id = 1 AND a =1
在上述的语句里,预期是数据库里a的值是1才会进行更新,如果此时数据库中的值已经被修改了,这个UPDATE语句就会失败。业务方通过判断受影响的行数是否为0,来判断是否更新成功
悲观锁是指写入数据时直接加锁,还是以上面的语句为例,就是从最开始的SELECT
语句就直接加上了锁,在加上锁以后可以直接更新了。
在使用悲观锁和乐观锁的时候,需要考虑数据一致性和并发性的问题。乐观锁适用于读多写少的场景,互联网大多数应用都是这一种。悲观锁适用于写多读少的场景,比如金融领域里对金额的操作就是以写为主。
相比较下,乐观锁的性能要比悲观锁好很多
行锁和表锁是根据锁的范围来划分的,一般来说,行锁指的是锁住行,可能是一行或多行;表锁则是直接把整个表都锁住。
在MySQL里,InnoDB同时支持行锁和表锁,但是行锁是借助索引来实现的,前面也提到过了,如果查询没有命中任何的索引,那么InnoDB引擎是用不了行锁的,只能用表锁;当然,如果用的是MyISAM引擎,就只能使用表锁,因为这些引擎不支持行锁。