问题标签 [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.
database - ACID 和数据库事务如何工作?
ACID和数据库事务有什么关系?
ACID 是提供数据库事务还是相同的东西?
有人可以启发这个话题。
atomic - 内存映射文件和单个块的原子写入
如果我使用普通的 IO API 读取和写入单个文件,则可以保证写入在每个块的基础上都是原子的。也就是说,如果我的写入只修改了一个块,操作系统保证要么写入整个块,要么什么都不写入。
如何在内存映射文件上实现相同的效果?
内存映射文件只是字节数组,因此如果我修改字节数组,操作系统无法知道我何时认为写入“完成”,因此它可能(即使不太可能)换出内存中的内存在我的块写入操作的中间,实际上我写了半个块。
我需要某种“进入/离开临界区”,或者在写入文件时将文件的页面“固定”到内存中的某种方法。存在这样的东西吗?如果是这样,是否可以跨常见的 POSIX 系统和 Windows 移植?
database - 基本数据库问题?
我很想知道更多关于数据库的知识,然后我现在才知道。我知道如何为我碰巧创建的任何 webapp 设置数据库后端,但仅此而已。例如,如果我正在创建三个不同的应用程序,我只需创建三个不同的数据库,然后为特定应用程序配置每个数据库。这都是简单的知识,我现在想更深入地了解数据库的实际工作方式。
假设我开发了一个需要大量空间和处理能力的应用程序。然后,该数据库必须分布在许多机器上。一个数据库究竟如何分布在众多机器上,并且仍然能够写入记录然后检索它们。每个表是否都有自己的机器以及需要什么软件来确保不同的机器都成功地执行了它们的事务。
正如你所看到的,我是一个非常无知的数据库,哈哈。
任何帮助解决这个问题将不胜感激。
.net - 简单的批量数据持久化框架
是否有用于批量数据持久性的 ACID 框架,它还允许一些基本的搜索功能?我不是在寻找一个成熟的 DBMS,而是在寻找快速、轻便和简单的东西。即使只是处理原子提交的东西也会很棒,只是为了避免在电源故障的情况下重新发明它。
SQL Server 对此太慢并且开销太大,SQLite 甚至更慢(开销可能更少?)。
基本上,我需要每秒存储大量时间戳数据。作为规范化数据,这将对应于 ~10k 表行,但作为二进制数据,它可以使用 ~200kb 表示。显然,与将 10k 行写入关系数据库相比,将 200kb 写入磁盘是小菜一碟。
我可以简单地将它保存在一个或多个大型二进制文件中,然后实现我自己的一些索引以允许对某些字段进行快速过滤,但唯一让我害怕的是非原子事务和读/写锁定场景。
有什么建议吗?我正在使用 C# 顺便说一句,所以任何带有 .NET 包装器的东西都是首选。
[编辑]关于 ACID,我刚刚发现了这个,例如:Transactional NTFS 的托管包装器(尽管TxF是“Vista 及更高版本”功能)。
python - python中的任何写函数与数据库中的ACID具有相同的安全性
标题可能会更好,但无论如何。我想知道是否有任何函数可以写入文件,就像数据库的 ACID 属性一样。原因是,我想确保我正在执行的文件写入不会在断电时弄乱和损坏文件。
c# - NHibernate.Event.IPostDeleteEventListener 不能很好地处理事务
我有一个 NHibernate 映射类,它保存绑定到磁盘上文件的二进制数据。业务逻辑很简单:
- 当对象存储在数据库中时,blob 被写入一个正确命名以匹配对象 ID 的文件
- 当从数据库加载对象时,blob 被文件内容填充
- 当从数据库中删除对象时,文件也被删除
我使用了 IPostDeleteEventListener 来处理这三种情况
Session.Delete()
唯一的问题是,如果由于某种原因,事务在文件已被删除后回滚,但记录保留在数据库中,当应用程序尝试(重新)加载未删除的对象时会导致 FileNotFoundException。
另外,但这不是什么大问题,如果在插入后取消事务,我会得到一个垃圾文件。
只有在提交事务时,我才能执行这些文件系统操作?
[添加] MAYBE...我说也许,我找到了解决方法。该ITransaction
接口公开了一个RegisterSynchronization
接受接口作为参数的方法。也许这可以是解决方法:仅在事务完成后存储/删除文件。我需要进行更多调查,但似乎没有设计方法可以直接从 NHibernate 事件侦听器子系统挂钩提交/回滚。
mysql - 优化 MySql InnoDB 数据库中的慢查询
我有一个运行非常慢的查询的 MySql 数据库。我正在尽我所能让它表现更好,但看不到我在这里做错了什么。也许你可以?
查询:
如果 tablea.d=100 给出 1500 行并且 (tablea.d=tableb.d OR tableb.d=1) 给出 1600 行,则此查询需要 10 秒才能运行。这似乎真的很慢。我需要让它更快,但我看不出我做错了什么。
MySql 解释输出:
php - 如何同步mysql数据库请求?
我在一个表中有很多条目是为了执行工作而提取的。这可以扩展到多台服务器。
当服务器获取一堆行以添加到自己的作业队列中时,它们应该被“锁定”,以便没有其他服务器获取它们。当执行更新时,时间戳会增加并且它们被“解锁”。
我目前通过更新表中名为“jobserver”的字段来执行此操作,该字段默认为空,并带有作业服务器的 id。
作业服务器仅选择字段为空的行。
当所有行都被处理时,它们的时间戳被更新,最后作业字段再次设置为空。
所以我需要同步这个:
每个服务器都在无限循环中执行上述操作。如果没有返回任何字段,则所有内容都是最新的 2 日期(最后一次更新不超过 24 小时)并被发送到 10 分钟。
我目前有 MyIsam,我想继续使用它,因为在我的情况下,它的性能比 innodb 好得多,但我听说 innodb 有 ACID 事务。
所以我可以执行选择并更新为一个。但这看起来和工作如何?
问题是我无法锁定表或其他东西,因为其他进程需要读/写并且无法锁定。
我也对共享信号量等更高级别的解决方案持开放态度。问题是同步需要跨多个服务器。
这种方法通常是理智的吗?你会做不同的事吗?
如何同步作业 selectino 以确保两台服务器不会更新相同的行?
mongodb - NoSQL 数据库无法处理的任务示例(如果有)
我想测试 NoSQL 世界。这只是好奇,而不是绝对需要(还)。我已经阅读了一些关于 SQL 和 NoSQL 数据库之间差异的内容。我对潜在的优势深信不疑,但我有点担心 NoSQL 不适用的情况。如果我理解 NoSQL 数据库基本上错过了 ACID 属性。
有人可以举一个 ACID 关系数据库可以处理但 NoSQL 数据库可能会惨遭失败的现实世界操作(例如电子商务网站,或科学应用程序,或......)的示例,或者系统地使用某种类型比赛条件还是因为停电等?
完美的示例将是在不修改数据库引擎的情况下无法解决的问题。NoSQL 数据库性能不佳的示例最终将是另一个问题,但在这里我想看看理论上我们何时不能使用这种技术。
也许找到这样的例子是特定于数据库的。如果是这样,让我们以 MongoDB 来代表 NoSQL 世界。
编辑:为了澄清这个问题,我不想争论哪种数据库更适合某些情况。我想知道这项技术在某些情况下是否会成为绝对的死胡同,因为无论我们多么努力地尝试 SQL 数据库提供的某些功能,都无法在 nosql 存储之上实现。由于有许多可用的 nosql 存储,我可以接受选择现有的 nosql 存储作为支持,但我最感兴趣的是存储应该提供的功能的最小子集,以便能够实现更高级别的功能(比如可以使用不提供 X 的商店...)。
database - 数据库持久性与性能
我已经研究了很多如何在数据库中实现持久性,如果我理解得很好,它的工作原理是这样的(简化的):
克伦特观点:
- 开始交易。
- 插入表值...
- 提交事务
DB引擎观点:
- 将事务开始指示器写入日志文件
- 将客户端所做的更改写入日志文件
- 将事务提交指示符写入日志文件
- 将日志文件刷新到 HDD(这确保了数据的持久性)
- 向客户端返回“OK”
我观察到的:
客户端应用程序是单线程应用程序(一个数据库连接)。我能够执行 400 个事务/秒,而将某些内容写入文件然后将此文件 fsync 到 HDD 的简单测试仅执行 150 个同步/秒。如果客户端是多线程/多连接,我会想象数据库引擎对事务进行分组并每几笔事务执行一次 fsync,但事实并非如此。
我的问题是,例如,MsSQL 是否真的在每次事务提交时同步日志文件(fsync、FlushFileBuffers 等),还是背后有其他某种魔法?