美文网首页
乐观锁与悲观锁

乐观锁与悲观锁

作者: LZhan | 来源:发表于2020-01-06 09:55 被阅读0次

    1 什么是乐观锁与悲观锁?

    乐观锁:就是对加锁持有乐观的态度,即先进行业务操作,认为数据在一般情况下不会造成冲突,不到最后一步不进行加锁,通常是在数据进行提交的时候,才会正式对数据的冲突进行检测,如果发现冲突了,则让返回用户错误的信息,让用户决定如何去做。

    乐观锁的实现有两种方式:
    1.使用数据版本(version)记录机制实现,这是最常用的一种方式。
    何为数据版本?就是为数据增加一个版本标识,一般是通过为数据库表增加一个数字类型的“version”字段来实现。当读取数据时,将version字段的值一同读出,数据每更新一次,对此version加1。当我们提交更新的时候,判断数据库表对应记录的当前版本信息与第一次取出来的version值进行比对,如果数据库表当前版本号与第一次取出来的version值相等,则予以更新,否则认为是过期数据。

    2.第二种方式与第一种方式差不多,同样是在数据库中添加一个字段使用时间戳timestamp,与version类似,在更新提交的时候检查当前数据库中数据的时间戳和自己更新前取到的时间戳进行对比,如果一致则OK,否则就是版本冲突。

    CAS操作方式:即compare and swap,涉及到三个操作数,数据所在的内存值,预期值,新值。当需要更新的时候,判断当前内存值与之前取到的值是否相等,若相等,则用新值更新;若失败重试,一般情况下是一个自旋操作,即不断地重试。


    悲观锁:是由数据库自己实现了的,要用的时候,我们直接调用数据库的相关语句就可以了(原理:共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程),如行锁、读锁和写锁等,都是在操作之前加锁,在Java中,synchronized的思想也是悲观锁。

    特点就是先获取锁,再进行业务操作,即“悲观”地认为获取锁是非常有可能失败的,因此要先确保获取锁成功再进行业务操作。通常所说的“一锁二查三更新”即指的是使用悲观锁。

    2 使用场景

    • 乐观锁:比较适合读取操作比较频繁的场景,如果出现大量的写入操作,数据发生冲突的可能性就会增大,为了保证数据的一致性,应用层需要不断的重新获取数据,这样会增加大量的查询操作,降低了系统的吞吐量。

    • 悲观锁:比较适合写入操作比较频繁的场景,如果出现大量的读取操作,每次读取的时候都会进行加锁,这样会增加大量的锁的开销,降低了系统的吞吐量。

    相关文章

      网友评论

          本文标题:乐观锁与悲观锁

          本文链接:https://www.haomeiwen.com/subject/qzphactx.html