问题标签 [read-committed-snapshot]
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.
sql - Oracle 等效于 SQL Server 快照隔离
在 Microsoft SQL Server 中,我使用 READ_COMMITTED_SNAPSHOT ISOLATION
在 Session 1 中,将 Principal 从 4000 更新为 5000
现在在第 2 节中,我说
我得到 4000,因为 Session 1 Transaction 没有提交。
如果我不使用 READ_COMMITTED_SNAPSHOT 隔离模式,并使用
- READ COMMITTED ISOLATION Mode 然后我的 Session 2 将继续等待
- 如果我使用 READ_UNCOMMITTED ISOLATION 模式,那么我的会话 2 将给出 5000(相当于在 select 语句上使用 nolock)
在 Oracle 中,如果我执行等效的命令集,默认情况下它的行为就像设置了 READ_COMMITTED_SNAPSHOT 隔离模式。
我在微软文章中读到 SNAPSHOT 隔离模式在更新完成之前写入 tempdb。
- 默认情况下,Oracle 如何实现这一点?
- 它也写入磁盘吗?它会导致 i/o 问题吗?
-Oracle 中的默认锁定级别与 SQL Server 不同吗?
提前感谢您的帮助和时间。
postgresql - 使用 READ COMMITTED 执行的 SELECT 可以在 Postgresql 中触发异常吗?
我需要拍摄一些表格行的快照(SELECT)以进行显示。这些行将永远不会在同一个事务中被修改或删除,或传输到可以修改这些行的另一个事务。我只想要在 Postgresql 函数中进行简单的类似快照的读取。
例如:
我正在考虑在我的 Postgresql 函数中设置 READ COMMITTED 事务级别:
这是否可以确保我的 SELECT 永远不会遇到异常,无论其他繁重而复杂的事务是否同时运行?我相信是的,但我不是 Postgresql 专家。
更新:
在做了更多阅读之后,我想知道这是否也可以解决问题?
sql-server - 您仍然可以在启用了快照隔离和 RCSI 的 SQL Server 数据库中独占锁定行(块读取器)吗?
您仍然可以在启用了快照隔离和 RCSI 的 SQL Server 数据库中独占锁定行(块读取器)吗?
我想基本上在一张桌子上做一个 xlock、rowlock 选择。
sql - 无写锁更新
任务:
打开更新某些行并回滚的第一个事务(T1)(总是)
在同一时间(在打开 T1 之后但在回滚之前)其他事务 T2 可以修改相同的行并提交它
在这种情况下 T2 等待 T1(使用 READ_COMMITTED_SNAPSHOT 隔离级别)
可以不等待就完成吗?
示例:第一个查询窗口
第二:
最后:
回滚 T1 后,T2 可以提交,我们在行中得到 'test2'
storage - COW 与 ROW 快照技术
当我阅读快照技术时……我发现写时复制 (COW) 和写时重定向 (ROW) 非常令人困惑,无法理解他们正在执行的实际操作……有人请解释一下如何他们实际上在工作......
谢谢
dac - 在发布期间忽略 Dacpac 快照选项
在部署其 dacpac(通过 sqlpackage.exe、DacFx 或 Visual Studio)时,是否可以忽略给定数据库项目的项目设置中设置的快照选项?
sql-server - 在 SQL Server 中设置已提交的读取快照时如何避免死锁?
对于测试场景,我需要在 SQL Server 实例上关闭已提交的读取快照。测试后我需要恢复更改。我使用 IF 语句来确定要执行的操作。这是我使用的脚本:
但是,在运行此脚本时,似乎会间歇性地出现死锁。有时操作会通过,而有时会发生死锁,我的数据库卡在单用户模式下。无论如何我可以确保不会发生这种情况吗?我考虑删除该WITH NO_WAIT
条款,但这似乎没有帮助。
quartz.net - 带有 AdoJobStore 的 Quartz.NET 可以安全地与已提交的读取快照隔离一起工作吗?
我们有一个 Quartz.NET 集群,它带有由 SQL Server 2012 Enterprise 支持的 AdoJobStore(如果重要的话,可以使用 AlwaysOn 同步复制)。它经常遇到死锁。我们在 3 个应用服务器上运行 Quartz.NET 以实现冗余。
在 Quartz 的数据库上启用 Read Committed Snapshot Isolation 以减少锁定是否安全?
配置:
SQL 日志:
看起来死锁的两个查询是:
SELECT TOP 1 TRIGGER_NAME, TRIGGER_GROUP, NEXT_FIRE_TIME, PRIORITY FROM QRTZ_TRIGGERS WHERE SCHED_NAME = 'QuartzScheduler' AND TRIGGER_STATE = @state AND NEXT_FIRE_TIME <= @noLaterThan AND (MISFIRE_INSTR = -1 OR (MISFIRE_INSTR <> -1 AND NEXT_FIRE_TIME >= @noEarlierThan)) ORDER BY NEXT_FIRE_TIME ASC, PRIORITY DESC
和
UPDATE QRTZ_TRIGGERS SET TRIGGER_STATE = @newState WHERE SCHED_NAME = 'QuartzScheduler' AND TRIGGER_NAME = @triggerName AND TRIGGER_GROUP = @triggerGroup AND TRIGGER_STATE = @oldState
c# - SQL 服务器。无法使 ALLOW_SNAPSHOT_ISOLATION 在 c# 代码中工作(它适用于 Management Studio)
最近我不得不解决锁问题,例如事务在锁资源上与另一个进程死锁,并被选为死锁受害者。重新运行事务。
在阅读了几篇文章并分析了我的系统环境后,我最终接受了最常用的解决方案:
ALTER DATABASE MyDb SET READ_COMMITTED_SNAPSHOT ON;
ALTER DATABASE MyDb SET ALLOW_SNAPSHOT_ISOLATION ON;
我想要ALLOW_SNAPSHOT_ISOLATION因为这种隔离在我的系统上是有意义的。
我成功实现了https://www.databasejournal.com/features/mssql/article.php/3566746/Controlling-Transactions-and-Locks-Part-5-SQL-2005的“允许快照隔离”部分中描述的流程-Snapshots.htm在 SQL Server Management Studio 中的两个会话上。
伪代码:
上面的示例按预期工作。这告诉我数据库配置正确。
我的问题出在 C# 代码上。虽然我能够防止锁定情况(READ_COMMITTED_SNAPSHOT正在工作),但我无法在我的 c# 代码上复制“允许快照隔离”行为。我尝试使用TransactionScope并没有它。我的目标是让它与TransactionScope一起使用。
我在 C# 上的测试是开始一个长事务:从我的表中读取值,等待 20 秒,再次读取值并打印两个值。当代码休眠 20 秒时,我转到 SQL Server Management Studio 并将值更新为新值。20 秒后显示原始值和新值。由于ALLOW_SNAPSHOT_ISOLATION和SET TRANSACTION ISOLATION LEVEL SNAPSHOT ,我期待这两个原始值
具有事务范围(我正在使用 Dapper):
没有事务范围:
有任何想法吗?
我正在使用 .Net 4.5、Dapper 1.50.2 和 SQL Server 2014
更新 1
我能够在非TransactionScope 版本上使用快照隔离:
但我仍然需要它来处理 TransactionScope 版本。
sql-server - SQL Server 数据库设置与隔离级别的比较
在过去几年中,我们注意到 SQL Server (2008r2) 数据库中的死锁和长时间运行事务的数量有所增加。我们目前使用以下设置运行我们的数据库,ALLOW_SNAPSHOT_ISOLATION OFF
并且READ_COMMITTED_SNAPSHOT OFF
. 使用重试/等待过程从代码管理死锁。
我们的应用程序代码(c#)SqlConnection
使用默认构造函数(从反编译似乎是)创建一个IsolationLevel.Unspecified
,我相信它允许 SQL 做它自己的事情,在我们的例子中,这与READ COMMITTED
(我认为)相同。
我们希望通过设置和覆盖 c# 构造函数来ALLOW_SNAPSHOT_ISOLATION ON
引入READ_COMMITTED_SNAPSHOT ON
快照RepeatableRead
。我相信这种设置组合将使我们的代码能够像现在一样运行。这将使我们能够零碎地评估我们的代码库,以确保隔离级别和快照的变化不会对我们对当前 SQL 过程功能的看法产生负面影响。当然,我们需要添加SET TRANSACTION ISOLATION LEVEL SNAPSHOT
到我们希望从快照中受益的任何过程的开头(以覆盖 c# 的设置IsolationLevel.RepeatableRead
)。
以这种方式处理它的原因是这两个数据库设置本质上迫使我们使我们的数据库脱机,这需要一个维护窗口,我们希望准备进行渐进式更改,但希望代码继续执行原样更改后立即生效。
我只是在寻找一些确认我的理解是正确的。如果我错了,为了模拟我们当前的工作环境,在进行 2 次数据库更改后我需要做什么?