分布式锁的功能

  1. 分布式锁使用者位于不同的机器中,锁获取成功之后,才可以对共享资源进行操作

  2. 锁具有重入的功能:即一个使用者可以多次获取某个锁

  3. 获取锁有超时的功能:即在指定的时间内去尝试获取锁,超过了超时时间,如果还未获取成功,则返回获取失败

  4. 能够自动容错,比如:A机器获取锁lock1之后,在释放锁lock1之前,A机器挂了,导致锁lock1未释放,结果会lock1一直被A机器占有着,遇到这种情况时,分布式锁要能够自动解决,可以这么做:持有锁的时候可以加个持有超时时间,超过了这个时间还未释放的,其他机器将有机会获取锁

预备技能:乐观锁

  通常我们修改表中一条数据过程如下:

t1:select获取记录R1
t2:对R1进行编辑
t3:update R1

  我们来看一下上面的过程存在的问题:

  如果A、B两个线程同时执行到t1,他们俩看到的R1的数据一样,然后都对R1进行编辑,然后去执行t3,最终2个线程都会更新成功,后面一个线程会把前面一个线程update的结果给覆盖掉,这就是并发修改数据存在的问题。

  我们可以在表中新增一个版本号,每次更新数据时候将版本号作为条件,并且每次更新时候版本号+1,过程优化一下,如下:

t1:打开事务start transaction
t2:select获取记录R1,声明变量v=R1.version
t3:对R1进行编辑
t4:执行更新操作
    update R1 set version = version + 1 where user_id=#user_id# and version = #v#;
t5:t4中的update会返回影响的行数,我们将其记录在count中,然后根据count来判断提交还是回滚
    if(count==1){
        //提交事务
        commit;
    }else{
        //回滚事务
        rollback;
    }

  上面重点在于步骤t4,当多个线程同时执行到t1,他们看到的R1是一样的,但是当他们执行到t4的时候,数据库会对update的这行记录加锁,确保并发情况下排队执行,所以只有第一个的update会返回1,其他的update结果会返回0,然后后面会判断count是否为1,进而对事务进行提交或者回滚。可以通过count的值知道修改数据是否成功了。

  上面这种方式就乐观锁。我们可以通过乐观锁的方式确保数据并发修改过程中的正确性。

最新文章

  1. 启动tomcat 报 Could not delete D:/online/.metadata/.plugins/org.eclipse.wst.server.core/tm
  2. iOS AES加密解密实现方法
  3. JDBC之修改数据
  4. iOS设计模式——委托(delegate)
  5. android128 zhihuibeijing 科大讯飞 语音识别
  6. Java NIO原理及实例
  7. iOS Sqlite3 Demo 及 FMDB Demo
  8. MediaPlayer视频播放器
  9. Stochastic Gradient Descent 随机梯度下降法-R实现
  10. [Swift]LeetCode645. 错误的集合 | Set Mismatch
  11. Flask 模板系统
  12. vector内存回收
  13. masstree Seastar
  14. Daily scrum 12.24
  15. 胡小兔的 PKUSC2018 游记
  16. P4001 [BJOI2006]狼抓兔子
  17. tomcat8+memcached session共享
  18. Oracle ORA-00911: 无效字符
  19. TMOUT优化终端超时
  20. VS新建一个模板工程

热门文章

  1. js代码突然在花括号回车自动多加了一个大括号
  2. ERROR: CAN'T FIND PYTHON EXECUTABLE "PYTHON", YOU CAN SET THE PYTHON ENV VARIABLE.解决办法
  3. xpath库学习
  4. ejs不能读取js变量??????
  5. go 调度机制简介
  6. logback不同业务的日志打印到不同文件
  7. 配置SSH无密码登录【原著】
  8. k8s-job使用
  9. Oracle Spatial分区应用研究之八:不同分区粒度在1.5亿要素量级下的查询性能
  10. SPFA + 链式前向星(详解)