乐观锁
乐观锁,简单理解就是比较乐观,假定为理想状态,每次获取数据得时候数据都不会被修改,所以每次获取数据得时候都不用加锁,但是在执行更新操作得时候需要判断这个数据有没有被修改过,如果数据被修改过就不执行更新操作,如果数据没有被修改过就执行更新操作,由于每次获取数据得时候都不加锁,那么在这期间数据有可能被其他程序修改过,所以一般用两种方法来解决这个问题version和cas方法.
version法:
在数据表上添加一个version字段,表示数据得版本,每执行一次更新操作version都增加1,那么在执行更新操作得时候就要去判断这个读出来得version值,与数据库中现有得version值是否相等,如果相等就执行更新操作,不相等就重新执行整体得更新操作。直至读到得version与数据库中得version相等更新成功。
CAS法:
CAS(Compare And Set)简称,在set写回的时候,加上初始状态的条件compare,只有初始状态不变时,才允许set写回成功,这是一种常见的降低读写锁冲突,保证数据一致性的方法。在分布式环境中,如果并发量很大,“查询+修改”的业务很容易出现数据不一致。
使用场景:
由于乐观锁在获取数据得时候不会加锁,在大量写操作执行得时候,数据冲突得可能性大大增加,每次执行更新得时候都要去查询数据有没有变更,如果变更了还要从新获取数据,降低了系统得吞吐量,所以乐观锁非常适合读取操作比较多得场景。
悲观锁
悲观锁,简单理解就是比较悲观,假定每次获取数据得时候都担心数据被修改,所以每次获取数据得时候都加锁来确保自己操作数据得时候没有别人修改,一旦当前任务操作数据加锁,那么其他任务想要对此数据得读和写操作都得等待,synchronized的思想也是悲观锁。
使用场景:
由于悲观锁,无论什么操作都会给数据加锁,来防止别人修改数据,如果读取数据的使用场景比较多,每次都加锁,大大降低了系统的吞吐量,所以悲观锁得使用场景非常适合写操作比较多的时候。
姓名:爱新觉罗胖小
说明:第一次写文章,有不对,不全的地方请大家评论留言我会及时改正。