一、共享锁和排他锁
共享锁:又称读锁(lock in share mode),例如 select,当上锁之后,另一个线程只可以读,不可以修改。
排他锁:又称写锁(for update),例如update,insert,delete,上锁之后,另一个线程不可以读和修改。
二、锁的前提
必须是mysql的innoDb表。
必须开启 transaction 事务。两者都有,锁才会生效。
需要注意的是:若一个线程 for update 执行锁住某行数据,其他线程读取的时候,sql 里没有 for update,则可以正常读取。
三、悲观锁和乐观锁
说到共享锁和排他锁,就会想到悲观锁,这两个都属于数据库带的悲观锁,乐观锁不是数据库带的。
悲观锁:总是觉得数据随时被人更改,此次操作会对数据造成冲突,效率比较低。
乐观锁:可以给表加一个 version 字段,先查询 version 字段放在缓存里,每次修改之前,在查询一次version 字段,若跟缓存里的数值不一致,则回滚。