问题标签 [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.
concurrency - mvcc、向量时钟、锁的性能影响?
NoSql dbs 使用 mvcc(例如 Voldemort)、矢量时钟(例如 Riak)或字段锁(Redis)。
类型的优缺点是什么?这些方法对写入性能有什么影响?/ 读?
sql - 使用 hsql 在 flyway 中更改数据库事务控制
在 HSQL 中更改 TRANSACTION CONTROL不能有任何活动事务。反过来,Flyway 在提交迁移 X 之后和从迁移 X 执行 SQL 之前,设置 autocommitt=false 并执行它自己的一些语句。因此,如果迁移包含SET DATABASE TRANSACTION CONTROL
语句,它将永远等待那些未提交的语句,从而导致应用程序挂起。
(旁注:flyway 在迁移之前执行的语句因版本而异,例如在 1.7 中是纯选择,因此从 LOCK 更改为 MVCC 是可能的,但是在我拥有 MVCC 之后,进一步迁移中的任何后续 DDL 语句都被挂起;在 flyway 2.0 中是在 schema_version 表上选择更新,因此任何事务控制更改都挂起;在 2.2 中选择更新已更改为显式锁定,与 2.0 中的效果相同)
所以基本上不可能在 flyway 迁移中更改事务控制。另一方面,flyway不鼓励迁移之外的变化。知道如何使用 flyway/hsql 更改事务控制吗?
更新 另一个观察结果是,当数据库控制设置为 MVCC 时,flyway 迁移中的任何 DDL 语句也会挂起应用程序。所以我会在每次迁移之前设置 LOCKS 并在之后恢复 MVCC。从 Flyway 的角度来看,这会是干净的解决方案吗?
performance - Firebird 会进行碎片整理吗?如果是这样,像聚集索引?
我已经看到了一些(从字面上看,只有几个)链接,并且在文档中没有任何关于使用 Firebird 进行集群的讨论,这是可以完成的。
然后,我在这个问题上一炮而红 CLUSTER command for Firebird?,但回答者告诉我,Firebird 甚至根本没有聚集索引,所以现在我真的很困惑。
Firebird 是否对数据进行物理排序?如果是这样,它可以通过任何键排序,而不仅仅是主键,并且可以打开和关闭集群/碎片整理,以便它只在停机期间进行?
如果不是,这是否会影响性能,因为磁盘需要更长的时间才能将自然应该彼此相邻的不同行放在一起?
(数据库菜鸟)
MVCC
我发现 Firebird 是基于 MVCC 的,所以旧数据实际上在“扫描”之前不会被覆盖。我非常喜欢那个!
同样,我找不到太多,但数据不会根据密钥进行碎片整理似乎真的很遗憾。
这表示对数据库页面进行了碎片整理,但没有提供进一步的解释。
symfony - Symfony2 的多版本并发控制?
我们想为我们的 Symfony2 webapp 实现多版本并发控制。
这意味着在任何事件上,都不UPDATE
会对数据库执行 no,而只会执行INSERT
s。由于我没有找到 Symfony2 对这个要求的任何原生支持,我决定如何手动实现它。
除了每个实体(例如 a )的常规 ID(主键)之外User
,我们还添加了另一个实体属性,例如 another userID
。因此,在每次更改用户属性时,我们可以简单地INSERT
为用户添加另一行,然后再有另一个ID
,但相同userID
。
然后可以始终通过特定的附加实体 ID 来识别实体。
但是这个解决方案有几个问题: 常规实体 ID 是主键,因此是与该实体的所有关系的标识符。也可以尝试创建组合主键(例如ID
plustimestamp
或ID
plus entityID
),但 Symfony2/Doctrine2 不支持组合主键。
那么你将如何在 Symfony2/Doctrine2 中实现 MVCC?你有办法解决这个问题吗?或者您会建议使用单独的历史记录表来跟踪所有更改吗?
mysql - 如何在 InnoDB MySQL 中启用非阻塞读取?
我有带有 InnoDB 引擎的表(tahminler,用户),我读到 InnoDB 使用行锁并具有 MVCC 功能,这两件事使得即使有同时写入查询(UPDATE 或 INSERT)也可以执行读取查询(SELECT 查询) )。
我的网站有以下场景: 1. user1 使用以下代码在两个表中插入信息:
2.与此同时,另一个用户user2正在尝试询问以前表的信息:
当 user2 要求从数据库中读取一些信息时,即使表的引擎是 InnoDB,但数据库会阻止读取请求,直到 user1 完成他的写入查询。
我更改了上面的代码并添加了一些行来解决使用 Transactions feauter 的问题,如下所示:
我添加了三个新行以在事务中执行更新和插入的查询,以让其他表和记录的读取成为可能,但不幸的是,即使在添加这些行之后读取块仍然保持原样,所以任何人都可以告诉如果有任何遗漏的查询或者我在这里犯了任何错误?
mysql - 了解 InnoDB 及其隔离级别和锁定
我在 MySQL 数据库中有一个带有 InnoDB 引擎(评论)的表,我有以下场景:
有两个用户试图同时访问同一个评论表,如下所示:
用户1:
用户2:
我想澄清以下几点,请:
- user2 无法从表中读取(SELECT),它应该等待一段时间(我认为直到 user1 的插入完成)。这种等待是 InnoDB 使用的称为行级锁的吗?
- 如果上一个问题的答案是肯定的,那么MVCC 的工作是什么?在 InnoDB 引擎中。我读到 MVCC 的意思是让用户读取表行(可重复读取),即使同时存在更新或插入情况(因为这里的用户读取了旧版本的行,即使它正在更新与此同时)。
笔记:
- 我想提一下,我以以下形式使用上面的代码,但它仍然出现同样的问题(等待问题):
用户1:
用户2:
- 我什至尝试将隔离级别从可重复读取更改为未提交读取-脏读取在我的情况下并不那么重要-(我认为它会解决等待问题,但它没有。等待仍然存在)。
用户1:
用户2:
最大的问题是当其他用户插入或更新行时,我的用户如何阅读?
domain-driven-design - 多版本并发控制和 CQRS 和 DDD
为了支持离线客户端,我想评估如何将多版本并发控制与 CQRS-DDD 系统相匹配。
向 CouchDB 学习,我很想为每个实体提供一个版本字段。但是还有其他版本的并发算法,例如矢量时钟。这让我想,也许我不应该为每个实体和/或事件公开这个版本概念。
不幸的是,我看到的大多数实现都是基于软件运行在单个服务器上的假设,其中事件的时间戳来自一个可靠的来源。但是,如果某些事件是远程和离线生成的,则本地客户端时钟偏移存在问题。在这种情况下,正常的时间戳似乎不是订购我的事件的可靠来源。
这是否迫使我评估某种形式的不基于时间戳的MVCC解决方案?
离线 CQRS 客户端必须评估哪些实现细节才能将延迟的事件链与中央服务器同步?
有什么好的开源例子吗?
我的 DDD 实体和/或 CQRS 查询 DTO 是否应该提供版本参数?
postgresql - postgres 中的锁定和事务应该阻止查询
让我们假设在 SQL 窗口 1 中我这样做:
然后从另一个窗口(窗口 2)我做:
我得到:
这很好,因为默认隔离级别是 READ COMMITTED 并且因为查询 1 从未提交,所以在我从窗口 1 显式提交之前,它执行的更改是不可读的。
事实上,如果我在窗口 1 中执行以下操作:
如果我重新运行查询 2,我可以看到更改。
我的问题是:
为什么查询 2 在我第一次运行时返回正常?我期望它会阻塞,因为窗口 1 中的事务尚未提交,并且放置在行上的锁id = 1
是(应该是)一个未释放的独占锁,它应该像在窗口 2 中执行的那样阻塞读取。其余的都是有道理的对我来说,但我希望在SELECT
执行窗口 1 中的显式提交之前会卡住。
sql-update - FOR UPDATE 的奇怪清理行为
我想知道即使在子查询中使用了 FOR UPDATE 子句,在 UPDATE 操作之后是否不应将 xmax 值设置为零?
我创建了测试表:
并插入了一些值:
现在,当我尝试使用子查询进行 UPDATE 时:
提交事务后,xmax 值不会重置为 0,而是保持为:
这是正确的行为吗?如果是,为什么 xmax 在操作后不设置为零?
java - Java 中的 TokuMX MVCC 事务
在同一文档上运行并发事务时如何保存高度竞争的记录?
似乎正在发生这种情况:
- MVCC 事务 A 开始。
- MVCC 事务 B 开始。
- 事务 A 更新 docA 和 docB。
- 事务 A 提交。
- 事务 B 更新 docA 和 docC - 当事务 A 已提交且不持有任何锁时,将获得锁。
- 事务 B 提交覆盖了转换 A 在 docA 上所做的工作。
这是示例代码:
我可以做一个检查来决定是否提交交易吗?或者这是 TokuMX 的预期行为(或者我做错了什么)?