问题标签 [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.
sql - 哪些事务会降低数据完整性?
我已经了解了一些关于数据库完整性的知识,并且知道如果我“需要将多个语句作为一个单元执行以使数据保持一致状态”,我应该使用事务。应用程序开发人员犯的数据库开发错误(第 16 点,选择答案)
维基百科使用了这个例子:
- 借记 100 美元到杂货费用帐户
- 将 100 美元存入支票账户
如果我尝试记入一个不存在的帐户 ID,并且我正确使用了约束,则会引发异常,我可以捕获它并回滚。如果停电,这两个更改保证是原子的。
但是,如果我理解正确,事务本身不会在所有情况下帮助我:(以 PHP 和 MySQL 为例)
- MySQL:开始事务
- MySQL:从表中选择数据
- PHP:使用所选数据计算状态
- PHP:如果状态有效,插入数据
- PHP:否则,不要插入数据
- MySQL:提交事务
这是行不通的,因为查询可以原子地一起执行而不会失败(是 PHP 决定存在错误,而不是某些 SQL 约束)。
其次,我刚刚测试过,事务是同步提交的,但可以异步启动。如果我启动一个事务,并添加 10 秒的延迟,我可以启动慢速脚本,并在这段时间内启动并提交另一个事务,演示并发事务。两个实例可以选择相同的数据,然后才能看到对方的修改。只有修改才能保证是原子的。
那么我能做什么呢?我想锁定一张桌子是可行的,但这是一种好的做法吗?有些条件可以用 SQL 在一条语句中描述,但更复杂的条件不能。
c# - 有没有办法在 C#、Java 等 OOP 语言中实现原子性?
数据库事务的 ACID 属性中的 A 原子性表明,在数据库上执行的每个事务都类似于二进制数系统,0 或 1,全有或全无。
是否有可能在 Java 或 C# 等编程语言或任何其他通用语言中实现相同的目标?例如
可能,我举了一个不好的例子,但我相信这应该足以给出一个想法。现在,想象一下,如果我创建Application
对象的行抛出异常,那么应用程序的执行将停止,静态变量的状态counter
已经发生了变化,系统的状态也发生了变化。有没有办法防止在抛出异常之前执行的语句造成损害?
mongodb - 非 ACID RethinkDB 或 MongoDB 如何维护非相等查询的二级索引
这更像是“内部运作”不解的问题:
不支持 * A *CID(意味着它们不能在单个事务中更新/插入然后回滚多个对象的数据)的 noSQL 数据库如何更新二级索引?
我的理解是——为了保持二级索引同步(否则它会变得陈旧读取)——这必须发生在同一个事务中。
此外,如果索引可以驻留在与数据不同的主机上,则需要存在分布式锁和/或两阶段提交,这样更新才能以原子方式工作。
但是如果这些数据库不支持多对象事务(这意味着它们不会对跨多个主机的数据进行两阶段提交),那么它们使用什么方法来保证驻留在 B 树结构中的二级索引与数据不陈旧?
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:将 4k 写入物理文件地址 4096
- 线程 #2:将 4k 写入物理文件地址 0
- 线程 #3:将 4k 写入物理文件地址 8192
- 线程 #4:将 4k 写入物理文件地址 409600
- 线程 #5:将 4k 写入物理文件地址 413696
- 使用此信息,DSM 将单个 12kb 写入操作安排到物理文件地址 0,并将单个 8kb 写入操作安排到物理文件地址 409600。
更新:DSM通过在 Linux AIO 上和POSIX AIO上提供OVERLAPPED
结构来完成 Windows 上的所有物理文件访问地址定位。io_prep_pwrite
aiocb
aio_offset
mysql - 如何处理同时更新表的多个请求
我正在为一个马戏团设计一个订票系统。假设还剩 1 个座位,有 4 个用户同时请求预订票。如何在 mysql 或 webserver 中处理此类情况。
mysql - 如果 ACID 属性定义明确,为什么我们有/接受不同的事务级别?
我对事务的 ACID 属性感到困惑。
据我了解:
交易必须符合 ACID。正是 ACID 确保了一系列语句确实是一个事务。到目前为止还可以。
现在有各种隔离级别(我省略了 READ-UNCOMMITED,因为它完全是一种非事务模式):READ-COMMITED、READ-REPEATABLE 和 SERIALIZABLE
这些级别中的每一个都提供不同程度的隔离,在我的理解中也是一致性。
所以我无法理解的是:
如果各种隔离级别提供不同级别的先决条件 ACID 属性,它们怎么可能是有效/可接受的隔离级别?
或者,什么是事务的 SQL 定义如此宽松/非正式/非严格,以至于出现了这些差异?我找不到任何 SQL 标准文档来阅读并查看实际定义是什么
sql - 多个 SQL/NoSQL 数据库架构中的一致性/原子性(甚至 ACID)属性
我更习惯于单独使用一个数据库(比如 PostgreSQL 或 ElasticSearch)。但目前我在原型应用程序中使用混合(PG 和 ES),并且可能会在混合中加入其他类型的数据库(例如:redis)。
假设某些数据需要以不同的方式保存到每个数据库中。 如果其中一个组件/数据库发生故障,您如何保持系统的一致性?
我面临的示例场景:PostgreSQL 上的数据更新,ElasticSearch 不可用。此时,系统不一致,因为我应该更新两个数据库。当我使用 SQL 数据库时,我可以简单地中止事务以将系统置于其先前的一致状态。
但是保持系统一致的最佳方法是什么?
- 每次检查该值是否已保存在所有数据库中?
- 如果失败,恢复之前的状态 ? 但是在一些 NoSQL 数据库中没有事务/ACID 机制,所以我不能轻易地恢复到以前的状态。
另外,如果多个数据库必须保持同步,是否有任何好的做法,比如添加某种“版本”元数据(无论是时间戳还是自制的递增版本号),这样您就可以使您的数据库重新同步?(不谈论内置的 CouchDB!)
此外,数据库并非全部自动更新,因此某些部分在短时间内不一致。我认为这取决于应用程序的业务,但有人对我发生的问题或解决方法有一些想法吗?我想这一定很艰难,并且取决于很多配置(可能很少有真正的好处)。
我想这可能是一个常见的架构问题,但我很难找到有关该主题的信息。
database - 在 ACID 中,C 是 DBMS 实现的责任吗?
我对酸的概念感到困惑。
所有参考资料/教科书都将 ACID 描述为数据库系统期望/需要维护以保持数据完整性的一组属性。
但是 ACID 的 C 部分,即 Consistency 似乎实际上并不是数据库的责任。
在某些参考文献(例如 Silberschatz)中,事务的代码本身(如果单独运行)使数据库处于一致状态,即事务代码是正确的,因此这是应用程序程序员的观点,而不是 DBMS。
在其他参考资料中,描述很模糊,例如“使数据库保持一致状态”
那么哪个是正确的?
transactions - RIAK 数据库和 ACID
你能帮我解决这些问题吗:
- RIAK 中的写操作是原子的吗?
- 写操作是否持久?
- 如何处理并发写入?
- RIAK 支持交易吗?
谢谢
mysql - 插入会阻止选择吗?什么时候没有?
考虑以下查询:
和
假设这些查询由不同的事务执行。这些有冲突吗?一个应该阻止另一个吗?选择不会产生不同的结果,具体取决于插入是在选择完成之前还是之后完成。但另一方面,在这两种情况下都考虑了同一列。那么一个应该阻止另一个吗?