乐观锁介绍:(乐观锁主要用于抢红包,淘宝抢购,秒杀之类)
乐观锁( Optimistic Locking ) 相对悲观锁而言,乐观锁假设认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让返回用户错误的信息,让用户决定如何去做。那么如何实现乐观锁呢,一般来说有以下2种方式:
1. 使用数据版本(Version)记录机制实现,这是乐观锁最常用的一种实现方式。
何谓数据版本?即为数据增加一个版本标识,一般是通过为数据库表增加一个数字类型的 “version” 字段来实现。
version版本号怎么确定? 在linux中:每个key操作时,都有版本号。
|操作一|操作二|
|--|--|
|初始版本为一|初始版本为一|
|watch age<br/>multi||
||set age 18<br/>版本加一,这时候数据版本为二<br/>这个自动提交,不加入事务|
|set age 20<br/>exec||
|当前操作的记录版本为一,小于实际的数据版本,提交失败<br/>||
如图:其他客户端提交数据一次数据库版本号version就进行更新一次,本次事务提交的时候对比版本号(会记录提交数据之前的版本情况),要是此次提交的数据版本号,低于数据库当前的版本号,就会提交失败;
读取数据时,将version字段的值一同读出,数据每更新一次,此version值加一。当我们提交更新的时候,判断数据库表对应记录的当前版本信息与第一次读取出时候版本的version值,相互进行比对,如果数据库表当前版本号与第一次取出来的version值相等,则予以更新,否则被更新的数据会被认为是过期的数据。
用下面的一张图来说明:
![](https://box.kancloud.cn/7162ebc922b05b1b9d5ce6883f97f3f0_741x499.png)
如上图所示,如果更新操作顺序执行,则数据的版本(version)会依次递增,不会产生冲突。但是如果发生有不同的业务操作对同一版本的数据进行了修改,那么,先提交的操作(图中B)会把数据version更新为2,当A在B之后提交更新时发现数据的version已经被修改了,那么A的更新操作就会失败。
2. 乐观锁定的第二种实现方式和第一种差不多,同样是在需要乐观锁控制的table中增加一个字段,名称无所谓,字段类型使用时间戳(timestamp), 和上面的version类似,也是在更新提交的时候检查当前数据库中数据的时间戳和自己更新前取到的时间戳进行对比,如果一致则OK,否则就是版本冲突。
- 目录
- 安装扩展
- 在 Windows 上安装 PHP 扩展
- 测试Redis扩展函数
- 教程
- 简介
- Redis 安装
- Redis 配置
- 运行
- 测试
- 书籍
- 《Redis开发与运维》
- 《Redis入门指南》
- 《Redis实战》
- 《当 Redis 遇上 ThinkPHP5》
- 参考站点
- 下载
- 命令参考
- 管理工具
- 视频
- 云数据库 Redis 版使用教程
- Redis 深入之道
- Redis高可用教程
- Redis入门
- NoSQL概述
- Redis概述
- Redis安装
- Jedis入门
- PHP命令
- PHP中利用Redis管道加快执行
- Hash操作
- Set操作
- Gearman
- MySQL - Redis配合使用方案
- 应用场景
- 缓存应用
- Redis实现简单的条件查询功能
- 获取网站中点击量最高的前n篇文章
- 显示最新的项目列表
- 排行榜相关
- 设计技巧
- SortedSets
- List列表
- 消息队列
- 最新文章
- Set集合
- 共同好友
- 独立 IP
- Linux教程
- 常用命令
- 哈希命令
- 字符串
- 集合
- 有序集合
- Redis 有序集合命令
- 有序集合命令(中)
- 发布订阅
- 用例
- 列表
- Lindex
- Ltrim
- Rpush
- Lset
- Llen
- Lpush
- 信息
- info memory
- 安装
- 数据类型
- Redis管道(pipeline)
- Memory Command
- 阿里云Redis
- 架构
- 4.0版本
- Redis 4.0 新功能介绍
- Redis Desktop Manager
- 创建hash列表数据
- Lua: 给 Redis 用户的入门指导
- Lua入门
- 乐观锁介绍
- 悲观锁介绍
- 脏数据
- Redis核心概念
- Redis事务
- Lua
- 在Redis中使用lua脚本
- php-redis
- mysql缓存服务器
- redis setnx 实现分布式锁和单机锁
- 为什么分布式一定要有Redis?