问题标签 [read-committed]

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.

0 投票
2 回答
3052 浏览

oracle - 如果只有一个与数据库的连接,我可以得到 ORA-08177 吗?

我的任务是在 oracle 的 Storm 后端上运行单元测试,以便我们可以查看后端是否有足够的质量用于生产。我遇到的一个问题是,如果我以可序列化模式连接,我将得到 ORA-08177(无法序列化此事务的访问)。当我使用读取提交模式时,问题就消失了。

现在我已经阅读了这篇 ask tom文章,它表明这基本上是一个并发问题。

假设我只有一个线程连接到数据库并且世界上没有其他人连接到这个数据库,是否有可能得到这个错误?如果是这样,有人可以为我提供一个会产生此错误的示例查询吗?

或者这可能表明游标或连接没有在某处关闭?或者一个事务没有被提交或回滚?

0 投票
3 回答
3536 浏览

sql - oracle中的READ COMMITTED数据库隔离级别

我正在开发一个连接到 oracle 的网络应用程序。我们在 oracle 中有一个表,其中有一列“已激活”。任何时候只有一行可以将此列设置为 1。为了强制执行这一点,我们一直在 Java 中使用 SERIALIZED 隔离级别,但是我们遇到了“无法序列化事务”错误,并且无法找出原因。

我们想知道 READ COMMITTED 的隔离级别是否可以完成这项工作。所以我的问题是:

如果我们有一个涉及以下 SQL 的事务:

鉴于可能同时执行多个这些事务,是否有可能多个 MODEL 行将激活标志设置为 1 ?

任何帮助,将不胜感激。

0 投票
2 回答
3292 浏览

sql-server - Read Committed Isolation Level 如何防止脏读

我从一个简单的问题开始:

根据 WikipediaMsdn中的脏读定义:

我们有 2 个并发事务,T1 和 T2

脏读发生在,当 T1 正在更新一行并且 T2 正在读取 T1“尚未提交”的行时

但是在 Read Committed Level 共享锁在数据被读取后立即释放(不是在事务结束时甚至语句结束时)

那么 Read Committed 如何防止脏读呢?Bkaz 一旦更新行 T2 上释放的共享锁可以读取更新的行并且 t1 可以回滚整个操作,那么我们在 t1 的手上有一个脏读

0 投票
1 回答
1444 浏览

mysql - MySQL REPEATABLE-READ Workbench 事务级别未设置

我们在 my.ini 文件中设置了以下内容

[mysqld] 事务隔离 = READ-COMMITTED

我们假设此设置将是所有用户会话的默认设置。

使用 PHPMyAdmin 登录时,tx_isolation 设置正确并按预期工作。但是,当使用 MySQL Workbench 6.0 连接到服务器时,对变量的检查显示 tx_isolation 级别设置为 REPEATABLE-READ。这种隔离级别的效果也符合预期。

我们希望全局设置事务隔离级别为 READ-COMMITTED,最好是在 DB 启动时。

我们已经重新启动了服务器(V 5.5.25a)和工作台。存储引擎是 INNODB。

0 投票
1 回答
203 浏览

database - 是否可以在 Teradata 中使用只读提交?

我发现 Teradata 使用:

它如何对应于通常数据库中的通常读取提交/脏?谢谢。

0 投票
1 回答
4250 浏览

oracle - 为什么它在 Oracle 文档的 Read Committed Transactions 示例中是“丢失更新”?

在《Oracle 数据库概念》一书中,Oracle 给出了一个例子来解释Read Committed Isolation Level

在示例中,事务 1 更新第 1 行,然后事务 2 在事务 1 提交之前更新同一行。因此,事务 2 一直等到事务 1 提交。然后事务 1 提交。之后事务 2 提交。当然,事务 2 提交后,事务 1 对行 1 的更新会被事务 2 覆盖。

它将这种情况视为lost update. 但在我看来,它不应该是“丢失的更新”,因为事务 1 已经提交。在单个事务中考虑丢失的更新。无论读取操作如何,该计划甚至等于可序列化计划。

这个例子在这里,或者更具体地说,在这里

在 Oracle 的词汇表中,丢失的更新是 -

一种数据完整性问题,其中一个数据写入者覆盖了修改相同数据的不同写入者的更改。

那么,您对此有何看法?它是“丢失更新”吗?如果是,是否可以通过数据库的并发控制来避免这种丢失的更新?

任何意见和帮助将不胜感激。

0 投票
1 回答
232 浏览

postgresql - 在两个并发的 READ COMMITTED 数据库事务中锁定一个新创建的、未提交的行

如果我有两个READ COMMITTEDPostgreSQL 数据库事务都使用相同的主键创建一个新行然后锁定该行,是否可以同时成功获取两个锁?

我的直觉是肯定的,因为这些新行都只存在于单个事务的范围内,但我很好奇新行和锁定在事务之间的处理方式是否不同。

0 投票
0 回答
22 浏览

sql - 锁定两个表,它们之间没有依赖关系

我有一个奇怪的情况。我正在开发一个 SQL Server 2005 数据库,我使用这个搜索了 DB 上的锁。

捕获一整天后,停止跟踪并查看结果,我发现一个阻塞查询阻止插入,但是,查询处于读取提交隔离和读取表 A,插入尝试插入表 B 并定义所有值。

任何人都知道为什么第一个查询会阻止第二个查询?

我已经搜索了这两个表的所有依赖项,但没有找到任何依赖项。

我知道这可以通过更改 select 语句的隔离级别来解决,但我想知道为什么会这样

谢谢!

0 投票
1 回答
630 浏览

mysql - MySQL InnoDB 是否使用 READ_COMMITTED 隔离级别锁定多行?

我在解决LOCK WAIT TIMEOUT EXCEEDMySQL InnoDB 错误时遇到了麻烦。

我已经阅读了这篇文章,它说如果我们使用隔离级别READ_COMMITTED,那么我的更新查询应该只锁定那些匹配WHERE条件的行,但这对我不起作用,因为我正在54为该查询获取行锁。

结果SHOW ENGINE INNODB STATUS;如下。

为什么我的更新查询条件仅匹配一行并且我使用隔离级别时锁定了54行?READ_COMMITED

0 投票
1 回答
60 浏览

mysql - MySQL 执行“无影响”临时插入,复制避免锁定

所以,我们正在尝试运行一个报告进入屏幕,它不会更改任何存储的数据。但是,它很复杂,因此需要通过几个 (TEMPORARY*) 表。

它从复制的活动表中提取数据。

temp_PreCalc

并从实时数据中填充它们以创建下一个 (TEMPORARY*) 表输出

有效地导致:

INSERT INTO temp_PostCalc (...) SELECT ... FROM temp_PreCalc JOIN live_Tab1 ON ... JOIN live_Tab2 ON ... JOIN live_Tab3 ON ...

该报告不是一个“确定”的答案,期望它只是一个“快照”报告,一旦出现在屏幕上就会过时。

没有顺序或可重复性问题。

因此,理想情况下,我会将我的 TRANSACTION ISOLATION LEVEL 降低到 READ COMMITTED... 但是,我不能因为 live_Tab1,2,3 是使用 BIN_LOG STATEMENT 类型复制的...

该语句既可爱又快速-几乎不需要任何时间来运行,因此资源负载现在比以前少(它进行了单独的选择和插入)但它等待(据我所知)因为等待的 SELECT用于在 live_Tab 上的可重复/可同步锁定,以便可以安全地复制任何结果。事实上,由于等待,现在需要更多时间。

我想看到响应时间的性能优势

除了将数据写入 (TEMPORARY*) 表然后丢弃。

没有 live_ 表目的地 - 只有来源......

    • 这些表实际上不是临时表,而是动态创建和丢弃的 InnoDB 表,因为报告计算需要自连接和删除......但它们是临时的

我现在似乎在兜圈子寻找答案。


我没有 SUPER 特权,也不想要它......所以不能为这个连接会话设置 BIN_LOG=0(为什么这是一个要求?)

所以...

如果我有一个临时数据库或表通配符,它​​将我的所有 temp_“临时”表从复制中排除...(我正在等待此更改在我的主机中心进行)

MySQL 是否允许我

SET Session TRANSACTION ISOLATION LEVEL READ COMMITTED;

INSERT INTO temp_PostCalc (...) SELECT ... FROM temp_PreCalc JOIN live_Tab1 ON ... JOIN live_Tab2 ON ... JOIN live_Tab3 ON ... ;

或者我还会得到我的

“无法执行语句:无法写入二进制日志,因为 BINLOG_FORMAT = STATEMENT 并且至少一个表使用仅限于基于行的日志记录的存储引擎......”

即使它在技术上不正确?我期待它,因为我认为复制将仅仅因为它看到“INSERT”语句而启动,并且将对涉及复制资格的任何表进行简单检查,即使没有目标实际上是复制有资格的....

还是会给我惊喜?

我真的无法面对使用不愉快的解决方案,比如

选择输出文件加载数据输入文件

事实上,我认为我什至不能使用它 - 我将如何获得唯一的文件名?我将如何清理它们?报告由最终用户直接按需运行,我只有 MySQL 接口访问服务器。

或通过 PHP 客户端流式传输,只是为了将 INSERT 与 SELECT 分开,这样 MySQL 就不会对哪些表符合复制条件感到不安......