问题标签 [acid]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
2572 浏览

sql - 插入失败,但标识值增长,这是否违反了原子性规则?

当我从大型 Excel 将数据导入新表时,如果一条记录失败,则不会导入任何内容。我认为这没关系,因为它符合原子性规则。但是,当我修复源数据错误并再次导入时,标识列不是从 1 开始,而是从一个大值开始。

例如

结果

维基百科将ACID描述为如下

原子性

原子性要求每个事务都是“全有或全无”:如果事务的一部分失败,则整个事务失败,数据库状态保持不变。原子系统必须保证每种情况下的原子性,包括电源故障、错误和崩溃。

因此,如果插入失败,SQL Server 似乎不会让数据库状态(标识值)保持不变,那么,这是否违反了 ACID 规则?

顺便说一句,当插入失败时,PostgreSQL 不会让身份(序列)值增长。(更新:仅有时,请参阅评论。不要依赖于此。)。

0 投票
1 回答
923 浏览

mongodb - MongoDB 支持 ACID 到什么级别?

MongoDB 不是关系数据库,产品也不遵循关系架构。但是对于来自 RDBMS 世界的人,我想知道 MongoDB 在多大程度上支持 ACID(原子性、一致性、隔离性、持久性)。还是我们不应该从 ACID 的角度评估 MongoDB?

0 投票
1 回答
1390 浏览

mongodb - 文档数据库和模拟 ACID

看到最后的结果


我想使用文档数据库(出于各种原因)——可能是 CouchDB 或 MongoDB。但是,我的多文档交易也需要 ACID。

但是,我确实计划使用“仅添加”模型 - 更改作为新文档添加(添加是添加,更新是添加副本+转换数据,删除是添加具有相同 ID + 删除标志的空文档)。我会定期对数据库运行压缩以删除非当前文档。

考虑到这一点,以下想法是否存在漏洞:

维护正在进行的当前事务的集合。此集合将保存带有正在进行的事务的事务 ID(GUID + 时间戳)的文档。

它有点像 MVCC,有点像 Git。我通过我知道在我开始之前设法完成的事务来设置检索上下文。我通过保留“正在进行的交易”而不是“交易修订”的列表来避免单一序列(因此单一执行)。而且,当然,我避免阅读未提交的事务并提供冲突回滚。

那么 - 这有什么漏洞吗?我的表现会受到严重影响吗?

编辑1:拜托拜托-不要敲打“如果您需要多文档交易,请不要使用文档数据库”。我知道,出于其他原因,我还是需要一个文档数据库。

Edit2:添加时间戳以避免来自检索事务开始后开始的事务的数据。可能会将时间戳更改为序列 ID。

Edit3:这是我想到的另一种算法 - 它可能比上面的更好:

新算法 - 更容易理解(这次可能更正:))

我们开始时文件是否已提交?
如果我们在当前执行的事务中看到具有事务 ID 的文档——它是在我们开始检索之前开始但当时尚未提交的事务——所以我们不想要它。如果我们看到一个事务 ID >= top transaction ID 的文档——它是在我们开始检索之后开始的事务——所以我们不想要它。

文档是最新的(最新版本)吗?
如果我们看到一个不在当前事务 ID 中的文档(事务在我们开始之前开始)并且是 < 顶级事务 ID(在我们开始之后开始的事务) - 那么有一个事务在我们过去完成提交使这个文件过时了——所以我们不想要它。

为什么排序不会受到伤害?
因为我们将排序添加为最后一个子句,所以我们总是会首先看到真正的排序工作。对于每个真正的排序“桶”,我们可能会得到多个文档,这些文档代表不同版本的模型对象。但是,模型对象之间的排序顺序仍然存在。

为什么计数器不让事务串行执行(一次一次)?
因为这不是 RDBMS——我们并没有真正的事务,所以我们不会像“选择更新”那样等待事务提交。另一个事务可以在我们完成后立即进行原子更改。

压缩:
有时必须进行一次压缩——获取所有真正旧的文档并将它们删除到另一个数据存储中。这不应该影响任何正在运行的检索或事务。

优化:

  1. 将条件放入查询本身。
  2. 将事务 ID 添加到所有索引。
  3. 确保具有相同模型对象 ID 的文档不会被分片到不同的节点。

费用是多少?
假设我们想要多个文档版本用于历史记录和审计,额外的成本是自动更新计数器、创建交易记录、“密封”每个模型对象的先前版本(标记为过时)并删除交易文档。这不应该太大。请注意,如果上述假设不成立,则额外成本相当高,尤其是对于检索而言。


结果:

我已经实现了上述算法(修改后的算法略有改动)。从功能上讲,它正在工作。但是,性能(至少在主从复制拓扑中具有 3 个节点的 MongoDB 上,没有 fsync 但在“提交”结束之前需要复制)是非常糟糕的。我一直在阅读我刚刚从不同线程中写入的内容。我在事务集合上获得了持续的集合锁,而我的索引跟不上持续的翻转。对于具有 10 个馈线线程的微小事务,性能上限为 20 TPS。

简而言之 - 不是一个好的通用解决方案。

0 投票
3 回答
9497 浏览

database - 数据库原子性一致性

原子性和一致性有什么区别?在我看来,两者都在用不同的词说同样的话。

原子性

事务的所有任务都已执行或都不执行。没有部分交易。例如,如果一个事务开始更新 100 行,但在 20 次更新后系统失败,则数据库回滚对这 20 行的更改。

一致性

事务将数据库从一种一致状态变为另一种一致状态。例如,在借记储蓄账户并贷记支票账户的银行交易中,失败不得导致数据库仅贷记一个账户,否则会导致数据不一致。

并且看起来原子性是一致性的子集,那么它应该是 cid(conistency,isolation,duribility) ,没有原子性

0 投票
2 回答
389 浏览

mongodb - MongoDB:将平均速度存储为字段或随时随地计算

我正在开发一个使用 MongoDB 以文档格式存储用户记录的 Android 应用程序。我将有几条记录,其中包含有关 GPS 轨迹的信息,例如开始经度和纬度、结束经度和纬度、总时间、最高速度和总距离。

我的问题是关于平均速度。我应该让我的应用程序计算平均速度并将其作为一个字段存储在文档中,还是应该只通过获取时间和距离来计算?

我将有数千条记录,应该根据平均速度进行排序,最合理的似乎也将平均速度存储在文档中。然而,这打破了传统的 SQL Acid 思维,即在数据库之外计算速度。

记录集合的当前文档结构是这样的:

0 投票
1 回答
534 浏览

transactions - 模拟批量放入 hbase 的事务

我正在努力在 hbase 中实现回滚操作。我的组件被提供了所有信息来做 put(实际上有数百个这样的 put)——表、时间戳(可能为空)、家庭、限定符、值。它缓冲它们,然后批量调用 HTable.put()。考虑到数据未经预先验证的事实,任何 put 都可能失败。

我正在尝试实现回滚失败 put() 之前已经完成的操作的方法。

正如我所见,有 3 种回滚方式:

  1. 删除新项目(如果之前不存在此类项目)
  2. 什么都不做(如果之前存在完全相同的项目(包括时间戳))
  3. 执行另一个 Put(如果新的 Put 更改了旧行中的一些数据。注意:我知道在 hbase 中无法更改数据。通过“更改”,我指的是新数据被写入同一行的事实/timestamp/family/qualifier,旧的被丢弃了——因为在我的设置中,hbase 被指示只保留一个版本的项目)。

所以问题是 - 如何区分这 3 个看跌期权?当然,查询特定项目的 hbase 是很重要的,但是对我来说,对几百个项目进行简单的获取/扫描似乎不是很有效。

所以我正在寻找一些方法来在 hbase 上进行批量获取/扫描。

0 投票
0 回答
33 浏览

transactions - 文件系统的模式和事务

有两种存储数据的标准方法:数据库或文件系统。在这些之间,数据库在维护数据完整性方面至少有两个优点:

  • Schemas:我们可以声明数据的预期结构并保证数据满足该结构
  • 具有完整 ACID 属性的事务性

是否有任何文件系统或文件系统之上的文件系统管理器提供这些关键特性?

例如,我想象一个程序,它管理一个目录中的数据,我提供的模式,并通过它发出 CRUD 指令来更新这个目录,使用事务来确保原子性。

例如,可以归纳定义模式,例如

之后,指令CREATE /container1/image.jpg <contents>将失败,因为/container1不再满足pdfcontainer,这意味着/不再满足root

0 投票
3 回答
811 浏览

delphi - 试图破解 SQLite3 并发写作的方法,有更好的方法吗?

我使用Delphi XE2DISQLite v3(基本上是SQLite3的一个端口)。我喜欢 SQLite3的一切,除了缺乏并发编写,尤其是我在这个项目中广泛依赖多线程 :(

我的分析器明确表示我需要对此做一些事情,所以我决定使用这种方法:

  1. 每当我需要在 DB 中插入一条记录时,我不是执行 INSERT,而是write在一个特殊的文件夹中进行 SQL 查询,即。

    WriteToFile_Inline(SPECIAL_FOLDER_PATH + '\' + GUID, FileName + '|' + IntToStr(ID) + '|' + Hash + '|' + FloatToStr(ModifDate) + '|' + ...);

  2. 我添加了一个timer(在主应用程序线程中)每分钟触发一次,解析这些文件,然后使用事务插入查询。

  3. 最后删除那些临时文件。

结果是我获得了500% 的性能增益另外,这种技术是ACID,因为我总是可以SPECIAL_FOLDER_PATH在电源故障后扫描并执行我找到的 INSERT。

尽管结果很好,但我对使用的方法不是很满意(至少可以说是骇人听闻的),我一直在想,如果我可以拥有一个泛型——比如具有快速查找访问、线程安全、ACID 列表,这将是更清洁(可能更快?)

所以我的问题是:你知道 Delphi XE2 的类似内容吗?


PS。我相信许多阅读上面代码的人都会感到震惊,并且会开始侮辱我!请成为我的客人,但如果您知道更好(即更快)的 ACID 方法,请分享您的想法

0 投票
1 回答
730 浏览

transactions - 非事务性数据库上的应用程序级事务

使用非事务性数据库在应用程序级别实现部分事务支持的技术是什么?

您能否分享此类技术的链接?

0 投票
1 回答
261 浏览

locking - 混合最终一致性系统和遗留 ACID 系统

是否有将最终一致性系统与传统 ACID 系统混合的模式?

我想将数据存储在大型机上需要类似 ACID 事务的一些(至少两个)遗留系统中。那些大型机数据库(我们称它们为 OldWorld)在同一进程中的同一事务管理器下运行,因此大型机系统的一致性没有问题。

我有一个事务管理器,可以在非大型机环境(让我们称之为 NewWorld)中使用大型机 tm 和支持 ACID 的关系数据库处理 XA 事务。但我不想使用 XA-Transaction,因为它经常会导致大型机端长时间运行的锁出现问题,而且在许多情况下,我不需要两个世界的所有 ACID 功能。我一直想要一个一致的大型机(旧世界中的所有数据在旧世界中都是一致的)。新世界系统在从主机端读取数据时可以处理不一致的数据(新旧不一致)。用于在 OldWorld 中存储数据的操作很简单,并且保存了不会在功能上失败的“仅添加操作”(它可能在技术上失败,但这应该始终是暂时的失败)。