一、乐观锁
每当对数据进行操作的时候,都认为只有我一个线程在操作,别人不会进行操作。
适用于“读取”操作比较频繁的场景。
通常用版本号(给表加一个version字段)、时间戳的方式去实现。
还可以使用CAS(Compare And Swap[Set])
1.比较:读取到了A值,修改为B值前,先看看是否和原值A一样
2.设置
一样:正常修改
不一样:不做操作(修改)
CAS的原子性 - 利用CPU的指令,在硬件层面实现了类似锁的效果。
CAS会存在的问题:ABA问题 - 虽然A和原值A一样,但是不能保证A没被修改过
解决ABA问题:版本号Version
二、悲观锁
每当对数据进行操作的时候,都认为不仅仅只有我一个线程,别的线程一定也同时在进行操作。
适用于“写入”操作比较频繁的场景。
通常使用数据库的锁机制来实现。(①set autocommit = 0 ②select num from t_goods where name = "臭豆腐" for update ③【对数据进行的操作】④commit;)这样当别的线程想对这条数据进行读取或者修改操作,就会提示被锁住。