问题标签 [read-uncommitted]

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 投票
4 回答
5635 浏览

sql-server - 在 NOLOCK 上使用 ADO.NET TransactionScope vs ExecuteCommand 的大容量站点,直接读取未提交?

刚刚阅读了 Omar 在他的博客 Linq to SQL 上的这篇有趣的文章,使用未提交的读取来解决事务死锁和查询超时问题,最后 Javed Hasan 开始与他争论他对大容量站点上无锁情况的解决方案。

这里要解决的问题是,从 sql 的意义上来说,我们需要使用带 NOLOCK 的 Select 语句或使用 SET TRANSACTION LEVEL READ UNCOMMITTED,否则 DB 中的大量行将被锁定并导致错误。Omar 使用的技术是 Linq2Sql,所以问题是我们如何在您的 C# 数据访问代码中实现这一点,这样就不会发生上述情况?

基本上在帖子中,Omar 通过在现实世界的站点上工作和测试以及使用 SqlProfiler 等工具来提出他的解决方案,而 Javed Hasan 则通过 MSDN 文档和 Scott Hanselman 的博客文章等来提出他的解决方案。

奥马尔建议使用以下

而 Javed Hasan 建议

我很想知道你们在 StatckOverflow 这样的高容量网站上对这个特定问题做了什么,或者 Jeff 和他们的人在这方面做了什么?

编辑:阅读第一篇文章后,我想在 Omar 的文章中指出一些事情。

  1. 他的方法确实遇到了连接问题,但他解决了,请参阅他的帖子。
  2. 更重要的是,他提到他尝试了使用 ADO.NET Transaction 的方式,甚至尝试了 Scott Hanselman 在他的博客上写的,但它不适用于大容量站点,它会大大降低性能。Omar 说,“System.Transactions 有很大的开销。我从来没有在大容量网站上使用它而不使 CPU 达到 100% 并且 Req/sec 下降到 1/10。它是为企业应用程序设计的,而不是为了高量网站。”
0 投票
4 回答
839 浏览

sql - 未提交的读取?

我正在研究数据库中潜在的并发问题,所以我去阅读了。我找到了http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.doc/admin/c0005267.htm,它提到了对未提交数据的访问。

访问未提交的数据。应用程序 A 可能会更新数据库中的值,而应用程序 B 可能会在提交之前读取该值。然后,如果 A 的值后来没有被提交,而是被撤销,那么 B 执行的计算是基于未提交的(并且可能是无效的)数据。

什么...我认为其他会话(相同的应用程序甚至相同的线程)可以读取尚未提交的数据?我认为只有将数据写入未提交事务的连接/会话(我不确定我的术语)才能读取未提交的数据。

其他线程真的可以读取到尚未提交的数据吗?我打算使用 mysql 但我可能会使用 sqlite

0 投票
1 回答
8062 浏览

.net - 如何在 LINQ to SQL 中使用 WITH(NOLOCK)?

我们可以像这样使用 SQL:

如何在不使用 LINQ to SQL 的情况下实现这一点TransactionScope

0 投票
0 回答
413 浏览

system.data.sqlite - 使用 System.Data.Sqlite 获取未提交的事务 Sqlite

我正在尝试使用 System.Data.Sqlite 库获取 SQLite 数据库中未提交记录的计数。到目前为止,我的研究一直指向使用 PRAGMA read_committed,但在提交记录之前,我的计数始终为 0。有小费吗?

0 投票
1 回答
9873 浏览

c# - 如何在 SQLite 中将事务隔离级别设置为 ReadUncommitted?

根据这篇文章的答案,它指出:

您是否知道除非您启用了共享缓存并且两个连接都来自同一个线程,否则 ReadUncommitted 将恢复为序列化隔离?

在 C# 中工作,然后我继续定义了一个 DLL 导入,如下所示:

我调用了这个函数来启用缓存,并在调用时获得了成功的结果状态 0。尽管如此,当执行以下几行并尝试将隔离级别设置为 ReadUncommitted 时,我仍然得到异常“isolationlevel”。

这个问题与我在此处发布的另一个问题有关。

如何在 SQLite 中以 ReadUncommitted 隔离级别执行查询?

0 投票
2 回答
407 浏览

sql-server-2005 - 阅读未提交和估计

有时,我想运行一个存储过程来粗略估计两个或三个不同表中有多少记录满足某些条件。如果在此估计期间添加、删除或更新了新记录,则没有真正的问题(我只是想要一个粗略的估计)。也就是说,我可以负担得起使用SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED. 但是,我对此有两个问题:

1)由于我只使用SELECT COUNT(*)指令,我真的需要将这些语句包装在一个BEGIN/COMMIT TRANSACTION块中吗?

2)我需要在存储过程SET TRANSACTION ISOLATION LEVEL READ COMMITTED结束时返回,还是在执行结束后自动设置?

0 投票
2 回答
936 浏览

db2 - 在 DB2 中删除未提交的插入行 (V8.2.7 - Fix 14)

根据客户的要求,我被要求将 Web 应用程序设置为未提交读隔离级别(这可能是个坏主意……)。

在测试隔离是否到位时,我在未提交的情况下插入了一行(DBVisualiser:@set autocommit off + 停止与数据库的 VPN 连接),然后我开始针对未提交的插入测试我的应用程序。

select * from MYTABLE WHERE MY ID = "NON_COMMIT_INSERT_ID" WITH UR工作正常。现在我想“删除”这一行,但我没有找到任何办法......

更新:一段时间后(大约 30 分钟),该行确实消失了。我想在自动发出回滚之前会有某种超时。有没有办法在这种情况发生之前删除未提交的行?

0 投票
2 回答
1260 浏览

mysql - 在 MySQL 中,为什么在使用未提交读取时从选择中设置变量会获得锁?

我们在 MySQL 中有一个使用 InnoDB 的表,并且我们使用未提交读的事务隔离级别。为什么@x如图所示设置会获得锁?

尝试从另一个提示更新此表会导致超时错误:

0 投票
1 回答
152 浏览

isolation-level - 使用 Rob Conery 的 Massive 时未提交阅读

在使用 Rob Conery 的 Massive 而不编写自己的查询时,有没有办法进行未提交的读取?

它适用于主要是只读的站点。网站的 CMS 类型。

0 投票
1 回答
7965 浏览

sql-server - “SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED”不考虑?还是我看错了?

我们遇到了一些显然以错误的隔离级别执行的数据库代码的问题。在代码的这个特定部分,它应该使用“READ UNCOMMITTED”执行以最小化锁。在这一点上,不一致的数据是可以的。

然而,代码实际上是用 READ COMMITTED 读取的,我们不知道为什么。

这是我们所做的:

  1. 打开连接
  2. 在此连接上执行“SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED”
  3. 打断点
  4. 执行 SQL

在断点上,我们向数据库发出以下命令:

此 SQL 现在报告 4 个池连接,其中一个是我们的连接,我们可以超越断点来执行我们的 SQL,它具有以下状态:

IE。会话 53 具有隔离级别 2(已提交读),在此会话上执行的最后一个 SQL 是“SET TRANSACTION ...”命令。

怎么会这样?

我们用 SQL Profiler 验证了这个连接在我们的 .NET 代码打开它之前没有存在,所以它没有从连接池中重用。

然而,有了一个新的连接,并且在其上执行的唯一且第一个 SQL 明确告诉它使用 READ UNCOMMITTED,连接如何仍然是 READ COMMITTED?

我们应该在这里看什么?

连接字符串(已编辑位)如下所示:

连接是正常SqlConnection连接,以正常方式打开。

不幸的是,如果我们编写打开 SqlConnection 的普通代码,我们将无法重现该问题,因此应用程序状态肯定有问题,但由于 SqlProfiler 和 Sql Server 都告诉我们是的,SQL 已执行,但没有,我不在乎。

什么会影响这一点?

完全相同的代码也会打开其他连接,也就是说,代码会执行多次并打开许多连接,因此池中会出现多个连接,但只有第一个连接会出现此问题。

这是 SQL Server 2008 R2,我们在 2012 年也重现了这个问题。

编辑

好的,还有更多信息。

首先,我们启用池化,或者更确切地说,我们没有明确禁用它,也没有调整连接字符串来创建“N”个池。

但是,此连接是使用此特定连接字符串打开的第一个连接,因此不会从池中检索它。另请参阅下面关于它永久“生病”的说明。

这个连接是这样建立的:

在此之前我们没有执行任何其他 SQL。

请注意,此代码在应用程序的生命周期中被多次使用,只有它打开的第一个连接最终会出错。

这种联系也变得永远病态。因为每次我们打开连接(即使我们可能把它从连接池中取出),上面的状态改变事件都会执行,试图再次设置隔离级别。这也失败了,但仅针对此单个连接。

此外,自从我发布此问题以来,我们发现了一件事会影响这一点。

通过更改我在上面发布的连接字符串:

对此:

然后这个问题就消失了,在前面列出的断点处,连接现在处于“READ UNCOMMITTED”状态。

这是一条红鲱鱼,在我们实际执行代码之前,我们的概述中不再报告连接。

我们正在继续调试。