NoSQL:版本戳
发布日期:2021-07-01 04:08:45
浏览次数:2
分类:技术文章
本文共 775 字,大约阅读时间需要 2 分钟。
虽然NoSQL不支持事务,但是面向聚合的NoSQL数据库在聚合内部支持原子操作,所以可以选择以聚合为单位来更新数据。但是即使是支持事务,事务系统也有其局限性,比如有些无法封装到一个事务里的更新操作,这些问题可以通过使用版本戳来解决。
商业事务与系统事务
一般所说的事务为商业事务,例如用户浏览商品目录,选中购买物品,填写订单信息。而只有在用户下单购买的时候,才会在数据库中发生系统事务,因为这会锁住数据库中的各个元素。
而发生系统事务时,需要重新读取商业事务所依赖的信息,并确保信息在读取之后一直没有变动。实现此技术的一个好办法就是保证数据库中的记录都有某种形式的版本戳。
版本戳除了可以避免更新冲突之外,还可以维护会话一致性,确保同一会话总是会访问到不比上次访问的版本低的服务器资源。
实现版本戳有以下四种方法:
- 使用计数器:可以很容易比较出版本的新旧,但是需要有一个主节点来保证不同版本的计数器值不会重复。
- 创建GUID(Globally Unique Identifier):可以根据资源组合起来生成该值,任何人都可以生成,但是数据太大也无法比较新旧。
- 根据资源内容生成哈希码:类似GUID。
- 使用上一次更新时的时间戳:可由多台计算机生成,但是必须保证它们的时钟同步,而且无法应对在每一毫秒更新很多次的情况。
也可以把几种生成方案的优点融合起来,创建一个复合版本戳。
在多节点环境中生成版本戳
对于,可以由主节点负责生成版本戳,而从节点必须使用主节点的版本戳。
对于,最常用的一种版本戳形式,是使用“数组式版本戳”。每个节点需要保存所有节点的版本戳(这里使用计数器),而通过节点之间的通信同步其版本戳,这样版本戳数组中只要有一个比另一个节点的版本戳数组大,则这个节点中的数据就更新。而若两个结点都有一个版本戳比对方大,这时就发生了“写入冲突”。
转载地址:https://mortal.blog.csdn.net/article/details/83027868 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月16日 23时53分40秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
使用webdriver中的JavascriptExecutor执行js改变DOM属性
2019-05-03
调研 中央空调 地暖 水暖
2019-05-03
谈创新和效率,如何总结分享. 归类,几大类
2019-05-03
架构图(拓扑图)画图工具分析整理(静态,动态,可交互图.层级tu)
2019-05-03
test 博客园功能 和 搜索 seo 能力
2019-05-03
待学习
2019-05-03
山东科技大学2015-2016学年第一学期程序设计基础期末考试第一场 题解
2019-05-03
Python教程-----引用模块
2019-05-03
山东科技大学2020年4月9日题解
2019-05-03
蓝桥杯题解(二)
2019-05-03
蓝桥杯题解(三)
2019-05-03
数学建模需要的Matlab知识速成,两小时Matlab速成,Matlab小白教程
2019-05-03
逆向工程核心原理笔记(一)——Hello World-2
2019-05-03
逆向工程核心原理笔记(三)——IA-32寄存器
2019-05-03
Ngrok内网穿透教程(国内地址)
2019-05-03
SpringBoot利用AOP防止请求重复提交
2019-05-03
Linux下安装Mysql5..7(Centos7)--亲测
2019-05-03
Linux下安装Nginx(Centos7)
2019-05-03