• 乐观锁和悲观锁


    乐观锁是一种思想,具体实现是表中有一个版本字段,第一次读的时候获取到这个字段。处理完业务逻辑开始更新的时候,需要再次查看该字段的值是否和第一次一样。如果一样更新,反之不更新。为什么叫乐观,原因是这个模式没有从数据库加锁,等到更新的时候再判断是否可以更新。

    悲观锁是数据库成名加锁,都会阻塞去等待锁。

    悲观锁:

    使用悲观锁很简单,直接手动加锁就行了。例如select * from XX for update。在select语句后面加了for update相当于加了排他锁(写锁),加了写锁后,其他的事务就不能对它修改了。需要等待当前事务修改完以后才可以修改。同一条记录,如果一个用户A使用select …… for update,B用户就不能对该条数据进行修改,必须A用户完成当前事务,B才可以对该条记录操作。

    乐观锁:

    不是数据层面上的锁,是需要自己手动去加的锁。一般添加一个版本实现。具体过程:

    A用户select * from table会查询出记录,同时也会有一个version字段,B用户select * from table也会查询出记录,也有一个version字段。B用户对这条记录进行修改:update a set name=”yy”,version = version+1 where ID=#{id} and version =#{version},判断之前查询到的version与现在的数据的version比较,同时会更新version字段。然后数据库的记录进行了修改,1 yy 2。B用户也对这条记录做同样修改,但是失败了,因为当前数据库中的版本和查询出来的不一致。

    欢迎批评指正,提出问题,谢谢!
  • 相关阅读:
    spring 心跳更新
    eclipse 控制台输出太多,显示不完整
    String
    iOS 开发之如何生成SDK(2)-----生成framework
    如何防止自己的APP被Hook
    JavaAPI类
    Java面向对象三大特性—封装
    Java类与对象
    Java基础易错点1
    Java数组反转及二维数组
  • 原文地址:https://www.cnblogs.com/xxeleanor/p/14369506.html
Copyright © 2020-2023  润新知