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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:NoSQL:映射-化简
下一篇:NoSQL分布式模型:一致性与持久性

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月16日 23时53分40秒