我可以在 CouchDB 中进行事务和锁定吗?

2023-12-24

我需要执行事务(开始、提交或回滚)、锁定(选择更新)。 我怎样才能在文档模型数据库中做到这一点?

Edit:

案例是这样的:

  • 我想经营一个拍卖网站。
  • 我还想如何直接购买。
  • 在直接购买中,我必须减少项目记录中的数量字段,但前提是数量大于零。这就是为什么我需要锁和事务。
  • 我不知道如何在没有锁和/或事务的情况下解决这个问题。

我可以用 CouchDB 解决这个问题吗?


不会。CouchDB 使用“乐观并发”模型。用最简单的术语来说,这仅意味着您随更新一起发送文档版本,如果当前文档版本与您发送的版本不匹配,CouchDB 将拒绝更改。

这确实很简单。您可以为 CouchDB 重新构建许多基于正常事务的场景。不过,在学习 CouchDB 时,您确实需要放弃 RDBMS 领域知识。从更高的层次解决问题比尝试将 Couch 塑造成基于 SQL 的世界更有帮助。

跟踪库存

您所描述的问题主要是库存问题。如果您有一个描述某个项目的文档,并且它包含“可用数量”字段,您可以像这样处理并发问题:

  1. 检索文档,记下_revCouchDB 发送的属性
  2. 如果数量字段大于零,则减少数量字段
  3. 使用以下命令发回更新后的文档_rev财产
  4. If the _rev与当前存储的数字匹配,完成!
  5. 如果有冲突(当_rev不匹配),检索最新的文档版本

在这种情况下,需要考虑两种可能的故障场景。如果最新文档版本的数量为 0,您可以像在 RDBMS 中一样处理它,并提醒用户他们实际上无法购买他们想要购买的东西。如果最新的文档版本的数量大于 0,您只需使用更新的数据重复该操作,然后从头开始。这迫使您比 RDBMS 做更多的工作,并且如果存在频繁的冲突更新,可能会有点烦人。

现在,我刚才给出的答案假设您将在 CouchDB 中执行操作,其方式与在 RDBMS 中执行操作的方式大致相同。我可能会以不同的方式处理这个问题:

我将从一个“主产品”文档开始,其中包含所有描述符数据(名称、图片、描述、价格等)。然后,我将为每个特定实例添加一个“库存票”文档,其中包含以下字段product_key and claimed_by。如果您要销售一种型号的锤子,并且有 20 个要出售,您可能会拥有包含以下钥匙的文档:hammer-1, hammer-2等,代表每个可用的锤子。

然后,我将创建一个视图,为我提供可用锤子的列表,并使用减少功能让我看到“总计”。这些完全是即兴的,但应该让您了解工作视图的样子。

Map

function(doc) 
{ 
    if (doc.type == 'inventory_ticket' && doc.claimed_by == null ) { 
        emit(doc.product_key, { 'inventory_ticket' :doc.id, '_rev' : doc._rev }); 
    } 
}

这为我提供了按产品密钥列出的可用“门票”列表。当有人想买锤子时,我可以抓住其中的一组,然后迭代发送更新(使用id and _rev)直到我成功领取一张(之前领取的门票将导致更新错误)。

Reduce

function (keys, values, combine) {
    return values.length;
}

这个reduce函数只是返回无人认领的总数inventory_ticket物品,这样您就可以知道有多少“锤子”可供购买。

Caveats

该解决方案需要您对所提出的特定问题进行大约 3.5 分钟的整体思考。可能有更好的方法来做到这一点!也就是说,它确实大大减少了更新冲突,并减少了响应新更新冲突的需要。在此模型下,不会有多个用户尝试更改主要产品条目中的数据。在最糟糕的情况下,您将有多个用户尝试领取一张票,如果您从您的视野中抓住了其中几张票,您只需转到下一张票并重试即可。

参考:https://wiki.apache.org/couchdb/Frequently_asked_questions#How_do_I_use_transactions_with_CouchDB.3F https://wiki.apache.org/couchdb/Frequently_asked_questions#How_do_I_use_transactions_with_CouchDB.3F

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我可以在 CouchDB 中进行事务和锁定吗? 的相关文章

  • Hibernate 乐观锁..它是如何工作的?

    我正在阅读下面关于休眠乐观锁定的博客 我打算将它与休眠一起使用 但是 我有一个担忧 我们有java代码和c 代码 都连接到一个数据库 虽然java代码可以使用hibernate来实现乐观锁定 但我想让c 代码做同样的事情 此外 C 代码正在
  • 用于只读 DB 的 java ORM

    我了解 hibernate 但我想知道是否有一个更轻的 ORM 引擎只读数据库 我的意思是 我不需要一些事务查询或更新一些记录 另一方面 我需要处理一些大的记录列表 List
  • 如何在postgresql中查找具有特定列的表

    我正在使用 PostgreSQL 9 1 我有一个表的列名 是否可以找到具有此列的表 如果是这样 怎么办 你也可以做 select table name from information schema columns where colum
  • 如何使用 pymongo 在 mongodb 中查询日期?

    我试图在 mongodb 中执行查询日期 但结果始终为空 我的查询如下 in the begin code def init self self now datetime now self db conexaoMongo self hora
  • 社交应用程序的数据库设计和优化注意事项

    通常的情况 我有一个简单的应用程序 允许人们上传照片并关注其他人 因此 每个用户都会有类似 墙 或 活动源 的东西 他或她可以在其中看到他 她的朋友 他或她关注的人 上传的最新照片 大多数功能都很容易实现 然而 当涉及到这个历史活动源时 由
  • 为什么 CouchDB 使用仅追加 B+ 树而不是 HAMT

    我正在阅读数据结构 尤其是不可变的数据结构 例如仅追加 B 树 http guide couchdb org draft btree html用于 CouchDB 和哈希数组映射 trie http en wikipedia org wik
  • 数据库分片和 Rails

    在 Rails 中处理分片数据库的最佳方法是什么 分片应该在应用层 活动记录层 数据库驱动层 代理层还是其他层处理 各自的优点和缺点是什么 FiveRuns 有一个名为的 gem数据结构 https github com bpot data
  • APEX 安装失败,PLS-00201:必须声明标识符“SYS.DBMS_DB_VERSION”

    尝试在 Oracle XE 18c 数据库上安装 Oracle APEX 20 2 如下官方说明 https docs oracle com en database oracle application express 20 1 htmig
  • 对多个数据库执行 SQL 查询

    我知道我的帖子与该论坛中的其他帖子的标题非常相似 但我真的找不到我需要的答案 这是我的问题 我的 Windows Server 上运行着 SQL Server 在我的 SQL Server 中 我有大约 30 个数据库 它们都具有相同的表和
  • 如何使用 cradle (CouchDB) 将参数传递给视图

    Using cradle https github com cloudhead cradle 如何将参数传递给 CouchDB 中的视图 Update 假设我想返回与其他属性匹配的文档 key 默认 document format key
  • 在触发期间更新 oracle 中的同一行?

    简短的问题 因为我不知道如何搜索这个 我可以 重新更新 同一行吗 例如 我有一个存储付款小计的字段 并且考虑到我的业务限制 我可以更新该值 我可以仅用触发器更新同一行的总计吗 预先谢谢您 顺便说一句 我正在使用 Oracle 和 PL SQ
  • 使用Python将文本文件导入Access 2003数据库

    我正在尝试使用我正在开发的 Python 3 4 应用程序将管道分隔的文本文件导入到具有现有表的 Access 数据库中 但遇到了一些麻烦 该应用程序将用于导入不同的文本文件 因此我使用条目小部件来写入文件名 并且我希望将输入的文件的内容加
  • 用于捕获审计跟踪的数据库设计的想法[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 如何维护数据库中的数据日志 我必须维护对每一行所做的每次更改的日志 这意味着我不能允许DELETE and UPDATE待执行 我怎样才能保留这
  • 同时使用 GUID 和自动递增整数

    我一直在研究使用 GUID 作为数据库中的主键 到目前为止 利似乎大于弊 然而 我发现 GUID 可能不是我想要的 在我的应用程序中 用户应该能够根据用户友好的 ID 来识别对象 因此 例如 如果他们想要获取特定产品而不输入全名 则可以使用
  • 串行类型的外键 - 确保始终手动填充

    我有两个表 国家和地区 CREATE TABLE Countries id SERIAL name VARCHAR 40 NOT NULL PRIMARY KEY id CREATE TABLE Regions id SERIAL coun
  • WordPress:wpdb->插入与wpdb->准备(wpdb->查询(“INSERT

    我想知道 WordPress 的插入功能是否也向数据添加斜杠 如果没有 准备查询方法似乎可以更好地防止 SQL 注入 我尝试在 codex api 中查找问题 然而 它似乎没有记录 谢谢 这个问题有点老了 自从提出这个问题以来 法典可能已经
  • @GenerateValue(strategy = GenerationType.SEQUENCE) 和 startVaule

    当在 Hibernate 中使用 GeneeratedValue Annotation 并向数据库添加新实体时 它的 id 为 1 n 是否可以设置第一个值 以便获得 id 例如10000 n 序列样式生成器应该做到这一点 Generate
  • Sequelize.js 中的自定义或覆盖连接

    我需要使用创建自定义连接条件Sequelize js http sequelizejs com使用 MSSQL 具体来说 我需要加入TableB基于一个COALESCE中的列的值TableA and TableB并最终得到这样的连接条件 L
  • 数据库字段中的逗号分隔值

    我有一个产品表 该表中的每一行对应一个产品 并由唯一的 ID 标识 现在 每个产品都可以有多个与该产品关联的 代码 例如 Id Code 0001 IN ON ME OH 0002 ON VI AC ZO 0003 QA PS OO ME
  • rake db:migrate db:reset 和 db:schema:load 之间的区别

    和 之间的不同rake db migrate and rake db reset我很清楚 我不明白的是如何rake db schema load与前两者不同 只是为了确保我在同一页面上 rake db migrate 运行尚未运行的迁移 r

随机推荐

  • 合并两个重叠列表并保持顺序的 Pythonic 方法

    好吧 我有两个列表 如下所示 他们可以并且将会有重叠的项目 例如 1 2 3 4 5 4 5 6 7 这里将not是重叠中的附加项目 例如 这将not发生 1 2 3 4 5 3 5 4 5 6 7 这些列表不一定是有序的 也不一定是唯一的
  • 如何将纬度/经度对转换为 PostGIS 地理类型?

    我正在尝试将一堆纬度 经度对加载到 PostGIS 地理类型中 以便能够按位置查询 特别是我有一个带有浮动纬度和经度列的表格以及一个geography Point 4326 柱子 我想要做 update mytable set geogra
  • 如何在单个画布android中移动多个位图

    我想在同一画布上移动多个位图 使用下面的代码 我可以在触摸屏幕时移动一个位图 但是 我无法识别位图上的触摸事件 因此我无法移动特定的位图 public class DrawTopologyView extends View Paint pa
  • Rails 7.0 + esbuild:运行应用程序出现错误:找不到命令“build”

    新生成的带有 esbuild 选项的 Rails 7 0 在启动时出错 rails new project name javascript esbuild css tailwind 在创建新的 Rails 7 项目时 我尝试使用以下命令启动
  • android.intent.action.DOWNLOAD_COMPLETE 是显式广播吗?

    我的应用程序 targetSdk 25 在清单中定义了一个广播接收器 如下所示
  • 如何在剃刀视图上设置必填字段?

    我想将 data val required 和 data val 属性添加到 html textbox 或 Html EditorFor 元素 是否可以不重写视图 通常您不应该重写视图来实现这一点 您应该使用相应的验证属性来装饰视图模型属性
  • 如何在 ipython-notebook 中获取 sympy 表达式的乳胶表?

    我正在使用 sympy 从多个表达式中收集术语 并希望将结果 在 ipython notebook 内 格式化在一个表中 其中术语位于最左边的列中 后续的每一列代表一个表达式 该列中的条目来自dict由返回sympy collect sym
  • 如何将 Phantom 钱包连接到我的 Flutter Web 应用程序?

    我一直在尝试将 Flutter Web 应用程序连接到 Phantom 钱包 但没有成功 尚未发布 pub dev 软件包来实现此目的 并且无法弄清楚如何使用 dart js 互操作来实现此目的 想知道是否有人已经弄清楚了 我有一段 粗略的
  • 返回活动时如何保留 Android ListView 滚动位置? [复制]

    这个问题在这里已经有答案了 可能的重复 返回 ListView 时保持 保存 恢复滚动位置 https stackoverflow com questions 3014089 maintain save restore scroll pos
  • 加权词嵌入是什么意思?

    In the paper http www aclweb org anthology S17 2100我正在努力实施 它说 在这项工作中 使用三种类型的文本对推文进行建模 表示 第一个是词袋模型 权重为 tf idf 词频 逆文档频率 部分
  • 如何更新 pyqtgraph 中的绘图?

    我正在尝试使用 PyQt5 和 pyqtgraph 拥有一个用户界面 我制作了两个复选框 每当我选择它们时 我想绘制代码中可用的两个数据集之一 每当我取消选择按钮时 我希望它清除相应的曲线 有两个带有文本的复选框A1 and A2他们每个人
  • Silverlight 中的同步 WebClient 下载

    我需要下载一个字符串 特别是来自 PHP Web 服务的 JSON 数组结果 作为返回字符串的函数 而不是 DownloadStringAsync 我需要这个 因为我正在编写一个下载字符串的函数 然后将其转换为 JsonArray 我正在使
  • Firebase Spark 版本中可以有多少个项目?

    我正在尝试添加第三个项目 但我不断收到此错误 您已经超出了可以创建的免费项目的最大数量 尝试通过项目设置删除一些项目或请求增加项目限制 我已通过项目设置删除了所有多余的项目 希望消除此错误 但它仍然存在 我不想要求更多的项目并且必须付费 我
  • 强制执行密码要求

    我想检查用户是否成功满足以下要求 密码至少有8个字符 由 1 个大写字母和 1 个小写字母组成 我该怎么做 我正在使用下面的 PHP 脚本 if strlen password lt 8 false else if preg match 0
  • 生成唯一 ID(检查或不检查)? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 考虑 youtube 视频网址 例如 e g http www youtube com watch v JVkaMqD5mI feature r
  • JavaFX 两个圆之间的距离并不断更新属性

    为了进行作业 我创建了 2 个可拖动的圆圈 并使用 javaFX 将它们连接起来 我需要添加计算两个圆之间的距离 或线的长度 的文本 并且当我拖动圆时该文本需要不断更新 但这就是我陷入困境的地方 Circle circle1 new Cir
  • 使用 PrintWindow API 截取屏幕截图(客户端区域)

    我正在使用 PrintWindow API 截取特定窗口 hwnd 的屏幕截图 这工作得很好 它可以截取整个窗口的屏幕截图 我的问题是 我的窗口高度是 742 宽度是 653 如果我想在窗口中间的某个位置 不是从 0 0 处 截取屏幕截图
  • 关于 GEKKO 中条件语句('m.if3')的问题

    我想在 GEKKO 代码中添加一些条件语句 我用 m if3 添加了以下语句 但是 它返回了语法错误 如果没有条件语句 我就不会出现这种错误 R1 1 m if3 R1 GEKKO m GEKKO remote False print m
  • 访问表达式主体成员以构建表达式树

    尝试使用表达式树按表达式构建订单 但我无法访问查询结果类的表达式主体属性 这是类结构 public class AssetFileRecord IAuditable IEntity INavigateToCustomValues publi
  • 我可以在 CouchDB 中进行事务和锁定吗?

    我需要执行事务 开始 提交或回滚 锁定 选择更新 我怎样才能在文档模型数据库中做到这一点 Edit 案例是这样的 我想经营一个拍卖网站 我还想如何直接购买 在直接购买中 我必须减少项目记录中的数量字段 但前提是数量大于零 这就是为什么我需要