问题标签 [snapshot-isolation]

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 投票
1 回答
200 浏览

sql-server - 您仍然可以在启用了快照隔离和 RCSI 的 SQL Server 数据库中独占锁定行(块读取器)吗?

您仍然可以在启用了快照隔离和 RCSI 的 SQL Server 数据库中独占锁定行(块读取器)吗?

我想基本上在一张桌子上做一个 xlock、rowlock 选择。

0 投票
1 回答
1527 浏览

sql - 数据库事务:“写入偏差”和“丢失更新”之间的区别

有人可以解释一下数据库事务理论中“写入偏差”和“丢失更新”之间的区别吗?有人可以给我一个例子吗?

0 投票
1 回答
2238 浏览

sql-server - 仅更改单个 ADO.NET 事务中的隔离级别

使用客户端框架、ORM 或类似构建查询(不支持 WITH(NOLOCK) 等查询提示)时,为单个事务实现不同隔离级别的最佳方法是什么?

想象一个应用程序使用 ReadUncommitted 级别进行许多复杂且长时间运行的查询(非常清楚相关风险),并且它应该使用 NHibernate 及其查询条件(或 QueryOver/LINQ,只是没有字符串连接!)。

NHibernate 不支持 with(nolock) 提示(使用本机 SQL 时除外,目前在许多情况下都使用该提示)。

因此,为了替换原生 SQL 字符串及其繁琐的构建代码,我想使用带有 IsolationLevel.ReadUncommitted 的事务来替换 'with(nolock)'。

但即使在 Commit/Rollback 之后,连接仍保持在更改后的隔离级别,以新级别运行所有内容。即使在 connection.Close() 之后,它也会返回到连接池并以更改的隔离级别重用。

我最初注意到这一点,因为我测试了打开一个具有快照隔离级别的连接并发送一个简单的查询,如果启用了数据库上的快照模式(通常不容易切换到快照),则禁用未提交的读取。测试数据库禁用了快照模式,所以我遇到了一个异常,并在 catch 块中将我的 UseReadUncommitted 变量设置为“true”,但后来来自“新”/重用连接的查询仍然得到相同的异常。

我编写了一个简单的类来将事务处理包装在 using 块中,自动重置 .Dispose() 中的 IsolationLevel。但这似乎会导致两次额外的数据库往返,并且我不确定更改后的隔离级别是否可能在某些情况下“幸存”处置并影响其他查询。该代码在第一次尝试中工作,它用于普通的 ADO.NET 连接/事务(如果好的话,我将为 NHibernate 会话做另一个!)。

有什么建议么?

0 投票
1 回答
881 浏览

sql - 带有“版本”字段的乐观锁与快照隔离级别

我想知道这两种乐观锁解决方案有什么优点/不方便之处:

  1. 使用“版本”字段并在更新期间检测更改(即使用休眠@Version 注释)

  2. 对事务使用快照隔离级别

如果我是正确的,这两个解决方案具有相同的行为:如果在事务期间更新了行,则会引发错误

谢谢

0 投票
2 回答
1338 浏览

sql-server - SQL Server 书签查找死锁解决方案

我在我的应用程序中检测到书签查找死锁,我无法决定使用哪种解决方案。它们似乎都不是最佳的。

以下是查询:

问题是在 CATEGORY 和 DATA 中有一个非聚集索引,两个查询以与聚集索引相反的顺序使用它。

即:更新锁定聚集索引并更新表,而选择锁定非聚集索引以进行书签查找,并且它们都希望彼此锁定(死锁)。

以下是我找到的选项:

1 - 创建一个包含选择查询中所有列的索引。- 它有效,但我认为这不是一个好主意,我必须包括在任何选择查询中使用的任何列,这些列可以在应用程序的任何地方更新。

2 - 将数据库的事务隔离级别更改为 COMMITTED_SNAPSHOT

3 - 向选择添加 NOLOCK 提示

4 - 删除索引

5 - 强制其中一个事务在更早的时间点阻塞,在它有机会获得最终阻塞另一个事务的锁之前。(不工作)

我认为第二个选项是最好的选择,但我知道它会产生其他问题,COMMITTED_SNAPSHOT 不应该是 SQL SERVER 中的默认隔离级别吗?

在我看来,应用程序或数据库逻辑中都没有任何错误,它是一个具有非聚集索引的简单表和两个访问同一个表的查询,一个用于更新,另一个用于选择。

解决这个问题的最佳方法是什么?还有其他解决方案吗?

我真的希望 SQL Server 能够自己解决它。

0 投票
2 回答
1008 浏览

sql-server - 在 SQL Server 视图中使用快照隔离级别

在做了一些研究之后,我真的找不到在 SQL Server 视图中使用快照隔离级别的方法。

是否有某种方法可以实现它,或者如果确实不可能,当我希望我的观点不阻止作家但仍然避免对他们使用 NOLOCK 提示时,处理这种情况的最佳方法是什么?

0 投票
1 回答
162 浏览

c# - 如果我在多个同时查询中使用 IsolationLevel.Snapshot 进行事务查询,则 SELECT @@IDENTITY 将返回什么?

我有多个应用程序通过多个事务访问表,我希望这些多个应用程序/事务能够让执行该事务的应用程序相应地插入每个主键/身份。出于某种原因,我不能使用SCOPE_IDENTITY这就是为什么我最后一种是使用@@IDENTITY。对于事务查询,我为每个事务实现了IsolationLevel.Snapshot以避免阻塞。

现在我的问题是,在这种情况下,每个事务是否会正确并相应地返回@@IDENTITY 。

前任。我同时执行三个查询:

  • Transactional1 查询插入,预期返回标识 100;
  • Transactional2 查询插入,预期返回标识 102;
  • Transactional3 查询插入,预期返回标识 103;

它会像这样相应地返回身份吗?这是我的目标

  • 交易 1 - 100
  • 交易 2 - 102
  • 交易 3 - 103

或者它可能会发生这样的事情?这是我害怕发生

  • 交易 1 - 102
  • 交易 2 - 103
  • 交易 3 - 101

这个现有的触发器是 SCOPE_IDENTITY 确实返回身份的原因,即使我的代码和查询中有 SCOPE_IDENTITY。

0 投票
1 回答
1370 浏览

c# - ASP.Net MVC 5 和 SQL 事务隔离级别

为数据库创建前端时遇到问题。我从数据库中的 EF6 Code First 开始。我创建了控制器并在创建页面上运行测试,但遇到了一个大问题。它给了我以下错误:

出现的另一件事是来自控制器的代码:

它突出显示了 await db.SaveChangesAsync(); 作为错误线。所以现在我很困惑在哪里可以更改 MVC 代码中的事务级别。是 Web.config、为数据库创建的模型还是控制器?我知道我必须使用 TransactionScope 来更改它。
更容易将默认事务范围更改为数据库的设置。只是不确定在哪里进行更改?

0 投票
1 回答
198 浏览

sql-server - 为我的 webapi 应用程序配置 IIS web 配置以使用 snapshop 隔离

由于我们系统的性能(死锁、数据库读取在数据库写入进行时被锁定等),我们想尝试 snapshop 隔离。我已在此处阅读有关快照隔离级别的信息。我们使用实体框架

我已经在数据库上设置了 Snapshop 隔离,并且想要配置我们的 Web api 应用程序以使用这种隔离进行读取和写入。我怎样才能做到这一点?我读过这可以在 web.config 中完成,但找不到如何..

0 投票
1 回答
1688 浏览

.net - 快照隔离事务由于更新冲突而中止,但没有事务开始

我在执行 UPDATE 语句时遇到错误。

错误:

由于更新冲突,快照隔离事务中止。您不能使用快照隔离直接或间接访问数据库“myDatabase”中的表“dbo.Companies”来更新、删除或插入已被另一个事务修改或删除的行。重试事务或更改更新/删除语句的隔离级别。

陈述:

我通过 ASP.NET 应用程序运行上述语句。

奇怪的是该语句是在没有事务的情况下执行的。代码如下:

我用谷歌搜索,只发现当我使用 SNAPSHOT 隔离级别事务时发生错误。但是没有交易。

该线程中所述,索引在某些情况下会有所帮助,但这对我没有帮助。

关于这个错误的任何想法?任何帮助将不胜感激。

谢谢,