问题标签 [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.
sql-server-2008 - 在 SQL Server 中打开快照隔离时如何更新聚集索引?
我有一个 SQL Server 2008 数据库SET ALLOW_SNAPSHOT_ISOLATION ON
和一个带有列 ID(主键)和 SSN(唯一非聚集索引)的 Person 表。
数据库中的其中一行是 ID = 1,SSN = 776-56-4453。
一对一连接,发生这种情况:
然后在另一个连接上:
正如预期的那样,即使在第二个连接完成执行后,第一个连接仍将 SSN 显示为“777-77-7777”。第一个连接的执行计划在 SSN 上显示“聚集索引搜索”,但是如果另一个连接上的索引键已更新,第一个连接如何继续使用该索引?
SQL Server 是否会做任何特别的事情来保持索引的多个版本以适应这种情况?
我试图了解快照隔离级别的性能特征,因此想确认 SQL Server 足够聪明,即使在从行的先前版本中检索过时数据时也可以使用现有索引。
sql-server - 由于更新冲突,快照隔离事务中止
以下陈述:
给了我这个 SQL 错误 3960:
由于更新冲突,快照隔离事务中止。您不能使用快照隔离直接或间接访问数据库“myDatabase”中的表“dbo.Companies”来更新、删除或插入已被另一个事务修改或删除的行。重试事务或更改更新/删除语句的隔离级别。
据我了解,从错误消息中,我不应该dbo.Companies
在另一个连接正在修改期间更新、删除或插入表dbo.Companies
。
但是为什么当我向另一个表dbo.Changes
(具有外键dbo.Companies
)插入新行并且我没有删除引用的行时会发生这种情况dbo.Companies
,但我只是更新行dbo.Companies
而不是主键?这应该可以正常工作,不是吗?(这是 SQL Server 中的错误吗?)
更新:
表格如下所示:
第二次更新正在做:
sql-server - READ_COMMITTED_SNAPSHOT 和 SNAPSHOT 隔离中的共享锁
我在微软的网站上读过 http://msdn.microsoft.com/en-us/library/ms173763.aspx
Sql Server 在读取数据时不请求锁,除非正在恢复数据库。
这是否意味着使用 READ_COMMITTED_SNAPSHOT/SNAPSHOT ISOLATION 的 Sql Server 根本不使用共享锁?这怎么可能?
例如,如果有 2 笔交易。第一个事务 T1 想要更新一些行。第二个事务 T2 开始读取同一行(此事务将他复制到某个输出缓冲区、响应缓冲区或在 Sql Server 中调用的任何内容)。同时事务 T1 开始更新该行(它首先创建了版本化行)。
事务T2是否有可能读取未提交的数据?请记住,事务 T2 在 T1 进行更新之前开始复制该行,因此该行上没有排他锁。
这种情况是否可能发生?如果在复制数据期间不对该行设置共享锁,如何避免这种情况?
concurrency - Paxos 与 Snapshot Isolation 并发控制的关系
我想知道基于 Paxos 的复制方案与快照隔离等不同并发模型之间的实际关系是什么。任何人都可以用很少的实际例子来解释这两者的关系吗?
database - 快照隔离 MVCC & B+ 树
我正在开发一个 NoSQL 数据库,它的一些索引使用 64 位基于哈希的 B+ 树,现在我正在研究在持久性 B+ 树上应用快照隔离多版本并发控制 (SI MVCC)。
我遇到的第一个问题是 B+ 树中的每个节点都有一个指向树中下一个节点的指针。一个 64 位指针,指向下一个节点所在文件中的字节地址。因此,当我更新记录节点时,B+ 树的该分支中的所有节点一直到根节点都必须更新 - 是否有更好/更简单的方法来避免如此多的磁盘更新(通常是 4 '磁盘扇区/节点必须在每次记录写入时更新,每个节点都适合单个磁盘扇区)?一个单独的目录记录可能包含所有链接节点的概述?
sql-server - Read Committed Snapshot Isolation:更新冲突回滚是否显示为死锁?
我已阅读提交的快照隔离并允许隔离ON
我的数据库。我仍然收到死锁错误。我很确定我知道发生了什么...
- 第一个事务在其事务开始时获得一个序列号。
- 第二个在其事务开始时获得较晚的序列号,但在第一个事务已经获得它之后(第二个序列号比第一个更新)。
- 第二个事务首先进入更新语句。当它检查行版本控制时,它会看到两个事务之前的记录,因为第一个事务尚未到达更新。它发现该行的序列号处于已提交状态并继续前进。
- 第一个事务轮到它,就像第二个事务找到相同的提交序列号,因为它不会看到第二个事务,因为它比它自己更新。当它尝试提交时,它发现另一个事务已经更新了尝试提交的记录,并且必须回滚。
这是我的问题:此回滚是否会在跟踪中显示为死锁?
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 不同吗?
提前感谢您的帮助和时间。
sql-server-2012 - SQL Server 2012 无法关闭快照隔离
使用下面的代码我无法关闭快照隔离。我正在使用 SQL Server 2012 框。我可以创建全新的空数据库,打开快照隔离,但我无法将其关闭。
“allow_snapshot_isolation OFF”行只是旋转它的轮子。
sql-server - 如何批量更新具有大量活跃读者的 SQL Server 数据库
我正在为以下场景设计 SQL Server 2012 数据库的解决方案
- 该数据库包含大约 1M 条记录,其中包含 4 或 5 个表之间的一些简单的父子关系
- 数据库上有 24x7 的高负载读取
- 每天一次,我们会收到一个包含大约 1000 个插入、更新和删除的批次,这些应该合并到数据库中,有时这个数字可能会更高。
- 除了每日批次外,数据库没有其他写入者
有一些“特殊”要求
- 由于这些更新,读者不应遇到任何明显的延迟
- 从读者的角度来看,应该以原子方式处理整个批次。读者不应看到部分处理的批次
- 如果更新中途失败,我们需要回滚批次的所有更改
- 批处理本身不是时间关键的,通过简单的实现,现在最多需要几分钟,这很好。
我正在考虑的选项是
围绕整个更新批次包装单个数据库事务(这可能是一个大事务),并使用快照隔离让读者在更新运行时读取原始数据。
使用分区切换,这个功能似乎是为这种用例而设计的。不利的一面似乎是,在我们开始处理批处理之前,我们需要创建所有原始数据的副本。
切换整个数据库。我们可以创建整个数据库的副本,在这个副本中处理批处理,然后将所有客户端重定向到这个数据库(例如,通过更改它们的连接字符串)。这甚至应该允许我们将数据库设为只读,甚至可能创建数据库的多个副本以实现可伸缩性。
这些选项中的哪一个或另一个最适合这种情况,为什么?
sql-server-2008-r2 - 验证 SNAPSHOT 隔离级别是否在 SQL Server 2008 R2 中打开
我将在 SSMS 中为 SQL Server 2008 R2 执行什么 SQL 以了解数据库中是否打开了 SNAPSHOT 隔离级别?