问题标签 [mvcc]
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 - 读取未提交的 mvcc 数据库
假设我想以读取提交模式(在 postgres 中)执行以下事务。
如果按此顺序调用操作:
我预计 T2 必须在 r(A) 处等待。因为 T1 在第一次读取时会为 A 设置一个排他锁,因为它想稍后再写入。但是使用 MVCC 就没有读锁了吗?
现在我有两个问题:
如果我使用 JDBC 读取一些数据,然后执行一个单独的命令来插入读取的数据。数据库如何知道它只在读取时必须进行排他锁?据我所知,在 2PL 中不允许将读锁增加到写锁。
我认为我的假设是错误的......这种情况在哪里等待或一个事务被杀死?未提交的读取不应该允许丢失更新,但我看不出这是如何工作的。
如果有人可以帮助我,我会很高兴。谢谢
database - 哪些数据存储系统允许查询系统过去的状态?
我正在设计一个系统,其中诸如“在特定时间匹配特定条件的所有记录的总和是多少”之类的问题很重要。
多值并发控制 (MVCC) 似乎是要走的路,因为它永远保持审计跟踪。
但是,如果数据存储能够为我处理这个问题,而不是从其他数据库功能中拼凑起来,那就太好了。现在,Oracle 和 CouchDB 其他数据库引擎使用 MVCC,但只是在幕后。他们使用它来解决冲突或决定在长时间运行的查询遇到最近更新的数据时要做什么。但我不知道有任何系统允许您明确地说“在 2009 年 1 月 20 日 17:00 的系统状态下,此查询返回什么”。那么有没有这样的系统呢?理想情况下,开源?
oracle - 关于oracle undo段绑定的问题
我不是DBA,只是想了解一下Oracle的多版本并发模型。
在启动 DML 操作时,MVCC 协议的第一步是绑定一个 undo 段。问题是为什么一个撤消段只能服务于一个活动事务?
谢谢你的时间~~
postgresql - 数据库内容版本控制
我有兴趣保留数据库中某些表上发生的每次更改的运行历史记录,从而能够重建数据库的历史状态以进行分析。
我正在使用 Postgres,而这个 MVCC 东西似乎我应该能够为此目的利用它,但我找不到任何文档来支持这一点。我可以做吗?有没有更好的办法?
任何输入表示赞赏!
UPD
我已将丹尼斯的回答标记为答案,因为他确实回答了 MVCC 是否是我想要的,这就是问题所在。但是,如果有人发现它有用,我已经确定的策略如下详述:
Postgres 功能可以满足我的需求:在线备份/时间点恢复。
http://www.postgresql.org/docs/8.1/static/backup-online.html解释了如何使用此功能,但基本上您可以将此“预写日志”设置为存档模式,拍摄数据库快照(例如,在它上线之前),然后不断地归档 WAL。然后,您可以随时使用日志重放来调用数据库的状态,如果您选择(通过不断地在备用服务器上重放新的 WAL),还可以使用热备用。
也许这种方法不像其他保存历史的方法那样优雅,因为您需要为要查询的每个时间点实际构建数据库,但是它看起来非常容易设置并且丢失零信息。这意味着当我有时间改进对历史数据的处理时,我将拥有一切,因此能够将我笨重的系统转换为更优雅的系统。
使它如此完美的一个关键事实是,我的“有效时间”与特定应用程序的“交易时间”相同——如果不是这种情况,我只会捕获“交易时间”。
在我发现 WAL 之前,我正在考虑只拍摄每日快照或其他东西,但所涉及的大尺寸要求和数据丢失并不适合我。
为了快速启动和运行而不损害我的数据保留,这似乎是一个完美的解决方案。
postgresql - 如何在 PostgreSQL 中显示行的旧版本?
我知道 Postgres 使用 MVCC 并将旧版本的行存储在磁盘上。我想访问(只读)一些旧的、废弃的具体行版本。我该怎么做?
performance - 我可以每 1-2 分钟运行一次 PostgreSQL Vacuum 吗?
我正在为即将到来的项目考虑各种支持 MVCC 的数据库,而 PostgreSQL 引起了我的注意。
我的程序的要求涉及大致如下的序列:
从当前版本的数据库中读取一些信息,修改 80-90% 的数据并在一个或多个事务中将其写回(想象一下在 Conway 的生命游戏中更新网格,其中网格的旧状态和新状态是必须的)。
提交后等待 1-2 分钟。在此期间,客户端可以针对新数据发出读取。
重复。
数据库将被限制为 2-4GB。
约 90% 的更改是对现有对象的更新,约 5% 将是新对象,约 5% 将是删除对象。
所以我的问题是,我是否可以合理地每 1-2 分钟运行一次简单的 VACUUM 命令作为步骤 1.5,并让 PostgreSQL 能够跟上每次可能进行的 2-3+GB 的更改?
mysql - Mysql InnoDB 从读取中锁定行
我已经阅读了 mysql 文档,也许我只是不明白这一切。我正在寻找的是读取其他会话的行锁定。当该行被锁定时,我希望其他会话等到锁定被释放。我不希望其他会话从快照中读取!他们必须等到发布!
我想得到的与以下示例完全相同,但对于单行而不是整个表锁:
先感谢您!
sql - MVCC 数据库是否在事务中看到插入的行?
MVCC数据库隔离模式是否允许正在进行的事务查看其他事务插入(和提交)的行?
例如,给定:
- 桌子
names[id BIGINT NOT NULL, name VARCHAR(30), PRIMARY KEY(id), UNIQUE(name)]
- 交易 T1 和 T2,
T2 什么时候第一次意识到新的行?到select
时候?到insert
时候?还是commit
当时?
postgresql - 用于具有大量更新的长期运行事务的数据库
我构建了一个用于数据提取和转换的工具。典型用例 - 以事务方式处理大量数据。
数字是 - 大约 10 秒 - 5 分钟的持续时间,200-10000 行更新(长时间不是由数据库本身而是由事务期间使用的外部服务引起的)。
访问数据库的代理有两种类型 - 多个读取代理和只有一个写入代理(因此,永远不会有多个并发写入)。
交易期间:
- 读取代理应该能够读取数据库并在当前状态下查看它。
- 写代理应该能够读取数据库(它可以在事务期间读取和写入)并在新的(尚未提交的)状态下看到它。
对于这种类型的负载,PostgreSQL 是一个不错的选择吗?我知道它使用 MVCC - 所以一般来说应该没问题,但是可以广泛使用长而大的交易吗?
还有哪些开源事务数据库可能是不错的选择(我不限于 SQL)?
附言
我不知道分片是否会影响性能。数据库将被分片。对于每个分片,将有多个读取器和一个写入器,但可以同时写入多个不同的分片。
我知道在交易期间最好不要使用外部服务,但在这种情况下 - 这是目标。该数据库用作一些重型、巨大、缓慢和最终一致的数据处理工具的可靠和一致的索引。
couchdb - CouchDB / Cloudant 中保存了多少文档修订,保存了多长时间?
在 CouchDB 和 Cloudant 中,当文档发生更改时,数据库会保留以前的版本。保留什么,保留多长时间?