问题标签 [repeatable-read]
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.
mysql - MySQL 可重复读隔离级别和丢失更新现象
在High Performance Java Persistence book 的 6.3.3.3 部分中写道,丢失更新现象在 MySQL 可重复读取隔离级别中是可能的。这是屏幕截图:
假设如下(隔离级别为 REPEATABLE READ):
问题:
在 tx1 提交时,MVCC 会检测到行版本(DB_TRX_ID)不再等于 7(而不是 10)并执行回滚?或者提交将成功导致丢失更新?
sql - 可重复读事务
R (A)
包含记录[(3), (4), (5)]
和事务的表T1
=UPDATE R SET A = A * 2; INSERT INTO A VALUES (6);
和 T2 ='SELECT AVG (A) FROM R; SELECT AVG (A) FROM R'
知道事务T2
是使用可重复读取执行的,哪些是第二个选择返回的可能值?
我认为可能的值是:4
和7.5
?我对吗?如果我正确理解可重复阅读,请告诉我。
mysql - 是否可以对刚刚更新的行进行幻读?
来自 MySQL 词汇表:
幻像:出现在查询结果集中但不在先前查询结果集中的行。例如,如果一个查询在一个事务中运行了两次,与此同时,另一个事务在插入新行或更新行以匹配查询的 WHERE 子句后提交。
粗体部分是否正确?如果我有
并且隔离级别是REPEATABLE READ,我这样做
即使没有人执行任何 INSERT 而只是 UPDATE,我有时也会从后面的查询中得到不同的结果?我的 MySQL 版本是 5.7。
SQL 标准表明幻读仅与并发 INSERT 相关,尽管生成这个词有点令人困惑。来自 ISO/IEC 9075:1992,数据库语言 SQL-1992 年 7 月 30 日(第二次非正式审查草案):
P3(“幻影”):SQL 事务 T1 读取满足某些搜索条件的行集 N。然后 SQL 事务 T2 执行 SQL 语句,生成满足 SQL 事务 T1 使用的搜索条件的一个或多个行。如果 SQL 事务 T1 然后以相同的搜索条件重复初始读取,它将获得不同的行集合。
postgresql - 此 PostgreSQL 代码会产生哪些并发问题?
好的,这是不言自明的架构:
我有 2 笔交易:T1 和 T2。
T1
将在“伦敦”任何商店出售的任何产品的价格提高 5%。
T2
将任何成本 >= 1050 美元的产品的价格降低 10%
我被要求告诉他们可能导致什么样的并发异常,以及我应该对哪个事务应用什么隔离级别以使其安全。
交易的代码没有给出,但我想它会是这样的:
READ COMMITTED
我对(默认)可能发生的情况的“猜测”是:
考虑产品 P,在“伦敦”以 1049 美元的价格出售
- 两笔交易开始
- 他们都考虑他们的行集:T1 将考虑在伦敦销售的所有产品(包括 P),T2 将考虑价格为 1050 美元或更高的产品(不包括 P)
- T1 提交并将 P 的价格设置为 1101 美元,但由于 P 不在 T2 开始时设置的行中,因此没有注意到更改,并且 T2 提交时没有考虑它
如果我没有弄乱定义,那应该是幻读的情况,如果我将 T2 设置为ISOLATION LEVEL REPEATABLE READ
mysql - Repeatable read regarding select * with order by and limit
At the default isolation level of mysql (Repeatable Read), if I issue a select like select * from table_a where column_a = 'a' order by id limit 100
, and after a while, I issued another statement within the same transaction like select * from table_a where column_a = 'a' order by id limit 100, 101
. Meanwhile, another transaction is appending into this table_a with new records (it won't be insert in-between) and it commits before the first transaction issues the second select. The question is would the second select in the first transaction return the newly inserted results by the second transaction?
sql - 当 DELETE 或 UPDATE 查询进入可重复读取隔离级别时,背后的理论是什么?
在Repeatable Read Isolation Level中,它不会阻止其他事务将新行插入到当前事务中已选择的表中。我想知道 DELETE 或 UPDATE 查询出现时背后的理论?考虑以下我正在尝试解决的示例。
假设使用关系数据库管理系统 (RDBMS) 和严格的 2 阶段锁定方法来进行并发控制。
下面的时序图显示了基于上述Customer表 T1 和 T2 的两个并发事务的执行,这两个事务都在REPEATABLE_READ 事务隔离级别上执行。
如果将以下 SQL 语句之一替换为T2 上的QUERY X而不是 INSERT 查询,是否会出现 Phantom 异常?证明你的答案。
- 更新客户设置余额 = 14 WHERE 余额 = 100;
- 从客户那里删除余额 = 12;
我是 DBMS 的新手,因此我非常感谢您提供帮助我更好地理解这些问题的友好解释。
oracle - REPEATABLE READ 会影响 Hibernate 期望吗?
我们StaleStateException
在代码中主要面临以下错误Hibernate - Batch update returned unexpected row count from update: 0 actual row count: 0 expected: 1
。
我们在使用 Oracle 12c 数据库时没有看到此错误,但仅在迁移到 PostgreSQL 12.1 后才开始频繁出现。
通过以下文章,我发现:
Oracle 不支持可重复读取- 我想这意味着 Hibernate 将读取的新值将是该时刻 Oracle DB 中的最新提交值,而不是在开始时读取的提交值交易。我对吗?
Postgres 支持可重复读取- 我想这意味着如果我们在事务开始时读取一个值,我们会在那个时刻得到一个提交的值,并且每当我们在同一个事务中执行读取时,我们都会得到相同的值,直到事务已提交,即使在初始读取后向数据库提交了新值。我又是对的吗?
- 我想在提交之后验证期望。不是吗?
所以,我的问题是.. 在这些情况下(postgres、oracle)对 Hibernate 的期望是否不同?即预期的行数与可重复读取的存在/不存在有关吗?
是否有任何其他可能的原因StaleStateException
不会发生在 Oracle 中而仅发生在 PostgreSQL 中?
java-8 - 以内存有效的方式重放java流?
有一些方法可以重播 java 8 流,例如这里提到的https://dzone.com/articles/how-to-replay-java-streams。现在,如果我想使用 log 巨大的 java 流(200-300mb)并将其转发以进行重播,该怎么办。那应该有效吗?但是,如果我不希望我的 JVM 在任何给定时间点占用那么多 RAM 怎么办。这仍然可能吗?解决方案是什么?
mysql - 了解具有 REPEATABLE_READ 和 READ_COMMITED 隔离级别的 InnoDB X-Lock
我有两个 mysql(AWS Aurora) 数据库表:
业务逻辑:多线程可以对Depatment和Employee表进行创建/修改或删除操作。对员工表的任何修改都将导致更新员工 ID
正如您在此处看到的,对于这两个操作,我在对其相应的员工进行任何更改之前都锁定了部门行。但在少数情况下,我们观察到员工记录存在于我们的数据库中,但没有相应的部门。
有人可以解释这种行为吗?
Spring 框架版本:5.2.0.RELEASE Aurora MySQL 版本:5.7.12
mysql - 了解 InnoDB 可重复读取隔离级别快照
我有下表:
它有两个帐户。“Bob”的余额为 100。“Jim”的余额为 200。
我运行这个查询将 50 从 Jim 转移到 Bob:
当该查询处于休眠状态时,我在另一个会话中运行以下查询以将 Jim 的余额设置为 500:
我认为会发生的是这会导致错误。该事务会将 Jim 的余额设置为 150,因为事务中的第一次读取(在 SLEEP 之前)将建立一个快照,其中 Jim 的余额为 200,并且该快照将在以后的查询中用于获取 Jim 的余额。所以我们将从 200 中减去 50,即使 Jim 的余额实际上已被另一个查询更改为 500。
但事实并非如此。实际上,最终结果是正确的。Bob 有 150,Jim 有 450。但我不明白为什么会这样。
MySQL 文档说关于可重复读取:
这是 InnoDB 的默认隔离级别。同一事务中的一致性读取读取第一次读取建立的快照。这意味着,如果您在同一事务中发出多个普通(非锁定)SELECT 语句,这些 SELECT 语句也相互一致。请参见第 15.7.2.3 节,“一致的非锁定读取”。
那么我在这里错过了什么?为什么事务中的 SELECT 语句似乎并非全部使用由第一个 SELECT 语句建立的快照?