乐观锁:
java当中 cas属于 乐观锁
数据库中一般通过 version 版本号实现
悲观锁:
java当中 synchronized 和 Lock
数据库中通过 select ... where id=? for update 实现
防重表:
通过建立一个字段或者多个字段的唯一索引,来防止并发情况下,数据只有一条记录能功能.
乐观锁的使用场景:
并发不超过20% 这句话很笼统
举个栗子:
比如 git代码 push到远程仓库,这种场景冲突的概率小于20%,就可以利用乐观锁
悲观锁:
比如转账这种场景,必须读取最新的金额去扣减
防重表:
悲观锁也会产生死锁,有时候,利用防重表的唯一索引,可以实现 唯一性的数据在并发环境下,只插入一条. 利用这一点和 扣减库存或者 扣减金额
在同一个事务中,来解决超卖或者扣减金额有错的情况下很有效.