问题标签 [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 投票
1 回答
572 浏览

sql - 哪些事务会降低数据完整性?

我已经了解了一些关于数据库完整性的知识,并且知道如果我“需要将多个语句作为一个单元执行以使数据保持一致状态”,​​我应该使用事务。应用程序开发人员犯的数据库开发错误(第 16 点,选择答案)

维基百科使用了这个例子:

  1. 借记 100 美元到杂货费用帐户
  2. 将 100 美元存入支票账户

如果我尝试记入一个不存在的帐户 ID,并且我正确使用了约束,则会引发异常,我可以捕获它并回滚。如果停电,这两个更改保证是原子的。


但是,如果我理解正确,事务本身不会在所有情况下帮助我:(以 PHP 和 MySQL 为例)

  1. MySQL:开始事务
  2. MySQL:从表中选择数据
  3. PHP:使用所选数据计算状态
    • PHP:如果状态有效,插入数据
    • PHP:否则,不要插入数据
  4. MySQL:提交事务

这是行不通的,因为查询可以原子地一起执行而不会失败(是 PHP 决定存在错误,而不是某些 SQL 约束)。

其次,我刚刚测试过,事务是同步提交的,但可以异步启动。如果我启动一个事务,并添加 10 秒的延迟,我可以启动慢速脚本,并在这段时间内启动并提交另一个事务,演示并发事务。两个实例可以选择相同的数据,然后才能看到对方的修改。只有修改才能保证是原子的。


那么我能做什么呢?我想锁定一张桌子是可行的,但这是一种好的做法吗?有些条件可以用 SQL 在一条语句中描述,但更复杂的条件不能。

0 投票
4 回答
164 浏览

c# - 有没有办法在 C#、Java 等 OOP 语言中实现原子性?

数据库事务的 ACID 属性中的 A 原子性表明,在数据库上执行的每个事务都类似于二进制数系统,0 或 1,全有或全无。

是否有可能在 Java 或 C# 等编程语言或任何其他通用语言中实现相同的目标?例如

可能,我举了一个不好的例子,但我相信这应该足以给出一个想法。现在,想象一下,如果我创建Application对象的行抛出异常,那么应用程序的执行将停止,静态变量的状态counter已经发生了变化,系统的状态也发生了变化。有没有办法防止在抛出异常之前执行的语句造成损害?

0 投票
3 回答
3309 浏览

mongodb - 非 ACID RethinkDB 或 MongoDB 如何维护非相等查询的二级索引

这更像是“内部运作”不解的问题:

不支持 * A *CID(意味着它们不能在单个事务中更新/插入然后回滚多个对象的数据)的 noSQL 数据库如何更新二级索引?

我的理解是——为了保持二级索引同步(否则它会变得陈旧读取)——这必须发生在同一个事务中。

此外,如果索引可以驻留在与数据不同的主机上,则需要存在分布式锁和/或两阶段提交,这样更新才能以原子方式工作。

但是如果这些数据库不支持多对象事务(这意味着它们不会对跨多个主机的数据进行两阶段提交),那么它们使用什么方法来保证驻留在 B 树结构中的二级索引与数据不陈旧?

0 投票
1 回答
335 浏览

c++ - 在写入磁盘之前排列物理磁盘扇区

Bakcground:我正在开发新的SparkleDB NoSQL 数据库,该数据库是 ACID 并且有自己的磁盘空间管理器 (DSM),用于访问数据库文件存储。DSM 允许在同一个物理文件上进行多线程并发 I/O 操作,即。异步 I/O 或重叠 I/O。我们禁用磁盘缓存,因此我们将页面直接写入磁盘,因为这是 ACID 数据库所必需的。

我的问题是:在将 I/O 请求发送到底层磁盘操作系统 I/O 子系统之前,通过从许多线程写入中安排连续的磁盘页面是否可以提高性能(如果它们是连续的,则合并要写入的数据),或者确实I/O 子系统会为您执行此操作吗?我的问题适用于 UNIX、Linux 和 Windows。

示例(所有发生在 100 毫秒的空间内):

  1. 线程 #1:将 4k 写入物理文件地址 4096
  2. 线程 #2:将 4k 写入物理文件地址 0
  3. 线程 #3:将 4k 写入物理文件地址 8192
  4. 线程 #4:将 4k 写入物理文件地址 409600
  5. 线程 #5:将 4k 写入物理文件地址 413696
  6. 使用此信息,DSM 将单个 12kb 写入操作安排到物理文件地址 0,并将单个 8kb 写入操作安排到物理文件地址 409600。

更新:DSM通过在 Linux AIO 上和POSIX AIO上提供OVERLAPPED结构来完成 Windows 上的所有物理文件访问地址定位。io_prep_pwriteaiocbaio_offset

0 投票
0 回答
496 浏览

mysql - 如何处理同时更新表的多个请求

我正在为一个马戏团设计一个订票系统。假设还剩 1 个座位,有 4 个用户同时请求预订票。如何在 mysql 或 webserver 中处理此类情况。

0 投票
3 回答
567 浏览

mysql - 如果 ACID 属性定义明确,为什么我们有/接受不同的事务级别?

我对事务的 ACID 属性感到困惑。
据我了解:
交易必须符合 ACID。正是 ACID 确保了一系列语句确实是一个事务。到目前为止还可以。
现在有各种隔离级别(我省略了 READ-UNCOMMITED,因为它完全是一种非事务模式):READ-COMMITED、READ-REPEATABLE 和 SERIALIZABLE
这些级别中的每一个都提供不同程度的隔离,在我的理解中也是一致性。
所以我无法理解的是:
如果各种隔离级别提供不同级别的先决条件 ACID 属性,它们怎么可能是有效/可接受的隔离级别?
或者,什么是事务的 SQL 定义如此宽松/非正式/非严格,以至于出现了这些差异?我找不到任何 SQL 标准文档来阅读并查看实际定义是什么

0 投票
2 回答
1014 浏览

sql - 多个 SQL/NoSQL 数据库架构中的一致性/原子性(甚至 ACID)属性

我更习惯于单独使用一个数据库(比如 PostgreSQL 或 ElasticSearch)。但目前我在原型应用程序中使用混合(PG 和 ES),并且可能会在混合中加入其他类型的数据库(例如:redis)。

假设某些数据需要以不同的方式保存到每个数据库中。 如果其中一个组件/数据库发生故障,您如何保持系统的一致性?

我面临的示例场景:PostgreSQL 上的数据更新,ElasticSearch 不可用。此时,系统不一致,因为我应该更新两个数据库。当我使用 SQL 数据库时,我可以简单地中止事务以将系统置于其先前的一致状态。

但是保持系统一致的最佳方法是什么?

  • 每次检查该值是否已保存在所有数据库中?
  • 如果失败,恢复之前的状态 ? 但是在一些 NoSQL 数据库中没有事务/ACID 机制,所以我不能轻易地恢复到以前的状态。

另外,如果多个数据库必须保持同步,是否有任何好的做法,比如添加某种“版本”元数据(无论是时间戳还是自制的递增版本号),这样您就可以使您的数据库重新同步?(不谈论内置的 CouchDB!)

此外,数据库并非全部自动更新,因此某些部分在短时间内不一致。我认为这取决于应用程序的业务,但有人对我发生的问题或解决方法有一些想法吗?我想这一定很艰难,并且取决于很多配置(可能很少有真正的好处)。

我想这可能是一个常见的架构问题,但我很难找到有关该主题的信息。

0 投票
1 回答
1342 浏览

database - 在 ACID 中,C 是 DBMS 实现的责任吗?

我对酸的概念感到困惑。
所有参考资料/教科书都将 ACID 描述为数据库系统期望/需要维护以保持数据完整性的一组属性。
但是 ACID 的 C 部分,即 Consistency 似乎实际上并不是数据库的责任。
在某些参考文献(例如 Silberschatz)中,事务的代码本身(如果单独运行)使数据库处于一致状态,即事务代码是正确的,因此这是应用程序程序员的观点,而不是 DBMS。
在其他参考资料中,描述很模糊,例如“使数据库保持一致状态”
那么哪个是正确的?

0 投票
2 回答
2182 浏览

transactions - RIAK 数据库和 ACID

你能帮我解决这些问题吗:

  1. RIAK 中的写操作是原子的吗?
  2. 写操作是否持久?
  3. 如何处理并发写入?
  4. RIAK 支持交易吗?

谢谢

0 投票
0 回答
67 浏览

mysql - 插入会阻止选择吗?什么时候没有?

考虑以下查询:

假设这些查询由不同的事务执行。这些有冲突吗?一个应该阻止另一个吗?选择不会产生不同的结果,具体取决于插入是在选择完成之前还是之后完成。但另一方面,在这两种情况下都考虑了同一列。那么一个应该阻止另一个吗?