问题标签 [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.
transactions - 分布式事务如何工作(例如 MSDTC)?
我以一种模糊的方式了解常规 ACID 事务是如何工作的。您在数据库上执行一些工作,直到设置了某种提交标志才确认工作。提交部分基于一些基本假设(例如单个磁盘块写入是原子的)。如果发生灾难性错误,您可以在恢复阶段清除未提交的数据。
分布式事务如何工作?在我读过的一些 MS 文档中,您可以以某种方式跨数据库和文件系统(除其他外)执行事务。
这项技术可以(并且可能)用于安装程序,您希望程序完全安装或完全不存在。您只需在安装程序启动时开始事务。接下来,您可以连接到注册表和文件系统,进行定义安装的更改。工作完成后,只需提交,如果由于某种原因安装失败,则回滚。这个神奇的分布式事务协调器会自动为您清理注册表和文件系统。
两个不同的系统怎么可能以这种方式进行交易?在我看来,总是有可能使系统处于不一致的状态,即文件系统已提交其更改而注册表没有。我认为在 MSDTC 中甚至可以通过网络执行事务。
我已经阅读了http://blogs.msdn.com/florinlazar/archive/2004/03/04/84199.aspx,但感觉这只是解释的开始,应该大大扩展第 4 步。
编辑:根据我在http://en.wikipedia.org/wiki/Distributed_transaction上收集的信息,可以通过两阶段提交(http://en.wikipedia.org/wiki/Two-phase_commit)来完成。读完后,我仍然没有 100% 理解方法,步骤之间似乎有很大的错误空间。
sql - 多进程写入的事务封装
我有一个数据库场景(我正在使用 Oracle),其中几个进程将插入到一个表中,并且一个进程从中选择。该表主要用作中间存储,多个进程(以下称为 Writers)向其写入日志事件,而单个进程(以下称为 Reader)则从中读取事件以进行进一步处理。Reader 必须读取插入到表中的所有事件。
目前,这是通过为每个插入的记录分配一个升序的 id 来完成的。读取器周期性地从表中选择一个条目块,其中 id 大于先前读取块的最大 id。例如:
这种方法的问题在于,由于写入器是并发操作的,因此行并不总是根据其分配的 id 按顺序插入,即使这些是按顺序升序分配的。也就是说,有时会在 id=110 的记录之后写入 id=100 的行,因为写入 id=110 的行的过程在写入记录 id=100 的进程之后开始,但首先提交。如果读取器已经读取了 id=110 的行,这可能会导致读取器丢失 id=100 的行。
强制写入者对表进行排他锁将解决问题,因为这将强制它们按顺序插入,并且还会让读取器等待任何未完成的提交。然而,这可能不会很快。
我的想法是,读者在阅读之前等待任何未完成的 Writer 提交就足够了。也就是说,只要 Reader 确实读取,Writers 就可以继续并发操作,直到所有 writers 完成。
我的问题是:
如何指示我的读者进程等待我的作家进程的任何未完成的提交?也欢迎对上述问题提出任何替代建议。
database - 在sqlite3中,插入事务中的选择可以成功吗?
我开始一个事务,即将几条记录插入到一个表中。我可以在事务提交之前从数据库中选择最新插入的记录吗?
acid - 实施 ACID
我正在开始研究一个需要在其数据库上提供 ACID 语义的项目。
由于数据的性质,它不适合存储在常见的现成系统(关系或键值)中。
关于如何实现必须提供 ACID 语义的系统,有哪些好的资源?
我的典型谷歌搜索返回更多关于已经提供 ACID 语义的系统的信息,而不是如何去实现这样的系统。
database - 重命名引用表中的 DB 列(违规?)
假设我有这张桌子:
其中 PersonAddressId 是 PersonId 和外键。重命名外键是否存在任何类型的数据库违规?当它们具有不同的名称时,使用起来会变得非常混乱。
.net - 在数据库之外实现事务的模式
我必须发送电子邮件、写入文件并调用 Web 服务。为了保持一致性,所有步骤都必须发生。如果任何步骤抛出异常或错误,则必须回滚所有步骤。
在我开始使用自己的对象 ACID 引擎之前,是否有任何普遍接受的模式用于在对象级别实现 ACID 语义?
更好的是,是否有任何现有的库可以用于 .NET 平台?
编辑:我知道发送电子邮件无法撤消,但无法连接到 SMTP 服务器是导致整个事务终止的原因。另外,我希望它可以扩展以用于未来的操作。
database - 什么是 ACID 的真实示例?
我正在寻找数据库的各种 ACID 属性的真实示例。
sqlite - SQLite3的数据库文件在突然断电或操作系统崩溃时会损坏吗?
我使用 sqlite3 的 open() 方法打开数据库文件并获得数据库连接,直到程序退出后连接才会关闭。如果出现计算机突然断电或操作系统崩溃等意外错误,是否会损坏数据库文件的模式,或丢失其句柄?更具体地说,如果我重新启动计算机,它可以保持可写状态吗?顺便说一句,我不关心发生错误时的数据丢失。
非常感谢你!
sql - 回滚原子和持久性
我试图了解数据库事务的 ACID 属性:它们是如何实现的;哪一部分是原子性,哪一部分是持久性等。
假设我有一个包含两个动作的交易,A
并且B
. 不幸的是,系统在执行时关闭了电源action B
。系统重置后,我们知道数据库将保留(通过 sqlite 中的回滚)执行之前的状态action A
。那么,这显示了哪种 ACID 属性,原子性还是持久性?
另一种情况:假设在执行时action B
,发生错误并被通知给应用程序,并且应用程序回滚。我认为这是由用户而不是数据库引擎实现的纯原子性。我对么?
crash - 磁盘扇区写入是原子的吗?
澄清问题:
当操作系统发送将扇区写入磁盘的命令时,它是原子的吗?即如果在写入命令后立即断电,则新数据的写入完全成功或旧数据保持不变。我不关心在多个扇区写入中会发生什么——撕裂的页面是可以接受的。
老问题:
假设您在磁盘上有旧数据 X,您在其上写入新数据 Y,并且在写入过程中一棵树倒在电源线上。如果没有花哨的 UPS 或电池支持的磁盘控制器,您最终会得到一个撕裂的页面,其中磁盘上的数据是 X 部分和 Y 部分。您是否最终会遇到磁盘上的数据是 X 部分和 Y 部分的情况,和部分垃圾?
我一直在尝试了解数据库等 ACID 系统的设计,而在我天真的想法看来,不使用预写日志的 firebird 似乎依赖于给定的写入不会破坏旧数据(X) -仅无法完全写入新数据(Y)。这意味着如果 X 的一部分被覆盖,则只能更改 X 中被覆盖的部分,而不是我们打算保留的 X 部分。
澄清一下,这意味着如果你有一个页面大小的缓冲区,比如 4096 字节,填充了我们想要保留的一半 Y,一半 X - 我们告诉操作系统在 X 上写入该缓冲区,没有严重磁盘的情况在写入过程中我们想要保留的一半 X 损坏的失败。