乐观锁
假定每次操作都不会产生冲突,一般使用cas进行解决。
update xxx set num=num+1 where num = xxx and name = xxx
悲观锁
假定每次操作都会冲突,都需要加锁解决。
select * for update
结果集中的任何行数据使用排他锁或共享锁,否则申请会阻塞
for update仅适用于InnoDB,且必须在事务块(BEGIN/COMMIT)中才能生效。在进行事务操作时,通过“for update”语句,MySQL会对查询结果集中每行数据都添加排他锁,其他线程对该记录的更新与删除操作都会阻塞。排他锁包含行锁、表锁。
分布式锁
redis:setnx + del
zookeeper:生成目录节点下的有序id,性能不够