悲观锁
思想
认为并发会频繁发生,为防止读取数据库时没有读到最新的数据,导致数据错误,秉承”宁可错杀,不可放过“的思想,在线程访问时,会将数据加锁,当其他线程再访问时,因锁未释放,会进入等待,待加锁线程释放锁后,再继续执行后续逻辑
常见实现方式
为数据库中的数据加行锁、表锁
乐观锁
思想
认为并发不是频繁发生,每次先查询版本号,再执行后续逻辑,若在后续查询或更新时,数据对应的版本号不是前面查询到的版本号,则立即向用户返回提示信息
常见实现方式
CAS
数据库版本号:数据库增加version字段,每次更新表数据时,version+1,更新数据前先查询版本号,再按照查询的版本号更新
乐观锁和悲观锁选型
悲观锁:适用于写操作频繁的业务场景,但会锁住行,导致其他线程等待,用户体验感不好
乐观锁:适用于读多写少的业务场景,若其他线程已对数据进行更改,则根据业务需求,使用自旋,或者立即返回提示