问题标签 [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 - 如果先前读取的行被并发事务更改,则使事务因冲突而失败
如果一行被使用 SNAPSHOT 隔离级别的事务修改,任何并发更新(由另一个事务)同一行会导致 SNAPSHOT 事务因冲突而失败。
有没有办法让只读取(不一定修改)的行发生相同的行为?
例如,如果发生以下序列,我希望 TX1 因冲突而失败:
- TX1 以 SNAPSHOT 隔离级别开始
- TX1 读取第 1 行
- TX2 修改第 1 行并提交
- TX1 提交,并因冲突而失败,因为第 1 行在读取后已被修改
sql-server - 为什么快照隔离级别默认关闭?
在 MS SQL Server 中,为了运行具有SNAPSHOT隔离级别的事务,首先需要在数据库级别打开它。
我只能假设打开这个标志会带来一些 DBA 需要注意的缺点。但我不知道它们是什么。
为什么默认不开启?
PS。注意我不是在谈论隔离级别的READ_COMMITTED_SNAPSHOT
版本。READ COMMITTED
c# - 无法将数据库还原到 SQL Server 中的快照
我想在每次运行单元测试时创建一个数据库快照并将数据库恢复到它。我可以创建快照,但在还原它时,我在执行此操作时遇到以下错误。
消息 5070,级别 16,状态 2,第 1
行当其他用户正在使用数据库“ImportData”时,无法更改数据库状态消息 3013,级别 16,状态 1,第 1 行
RESTORE DATABASE 异常终止。
下面列出了用于创建数据库并将其还原为快照的 SQL 查询。
创建快照:
恢复到快照
它指出
其他用户正在使用数据库时无法更改数据库状态
如何克服这个问题?我正在使用 .NET (C#) 来执行此操作。如何关闭连接才能RESTORE DATABASE
成功运行?
我希望创建快照并将数据库恢复到它的整个过程在测试套件中的每个测试中发生。
sql-server - SQL Server 2008 R2 快照隔离问题
我正在使用 SET TRANSACTION ISOLATION LEVEL SNAPSHOT 并在数据库上启用了快照,但我注意到的是,如果我执行简单的删除语句,例如
当从另一个表加载数据时,有效地清除表并用新数据重新填充表。当这个操作发生时,做一个简单的选择,它也在一个声明了快照的事务中运行,例如
如果 DELETE / INSERT 语句正在运行,则对表进行扫描,否则进行索引查找。这是预期的行为吗?
dac - 在发布期间忽略 Dacpac 快照选项
在部署其 dacpac(通过 sqlpackage.exe、DacFx 或 Visual Studio)时,是否可以忽略给定数据库项目的项目设置中设置的快照选项?
sql-server - 通过在打开 READ_COMMITTED_SNAPSHOT 的 SQL Server 数据库上使用 WITH (NOLOCK) 是否可以获得任何性能提升?
我在 Microsoft SQL Server 2014 上有一个数据库,其中READ_COMMITTED_SNAPSHOT
属性已打开。我理解这意味着读取不会被写入阻塞,因为读取不会发出共享锁,这是干净的读取。
我的问题是:WITH (NOLOCK)
在这种情况下使用 in select 语句是否可以获得任何性能提升?就我而言,我不介意阅读会很脏。
我试图找到这些信息,但只找到了使用WITH (NOLOCK)
和READ_COMMITTED_SNAPSHOT
开启之间的比较。但我已经戴上了。
c# - 将 TransactionScope 引入现有项目
我想在快照隔离模式下运行一个特定的 Linq2Sql 查询,而不影响我的应用程序的其余部分。
但是,每当我使用类似的代码时
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 次数据库更改后我需要做什么?
sql-server - 为什么在另一个快照隔离事务中插入具有引用行的外键引用行的行会导致事务挂起?
我在一个系统中遇到了一个有趣的问题,由于架构更改,单个线程中的第一个数据库事务阻止了第二个数据库事务完成,直到发生超时。
为了测试这一点,我创建了一个测试数据库:
在第一个测试中,修改表 One 中的行的事务已启动,但尚未提交。另一个事务正在插入到表 2 中,引用同一行的列在表 1 的第一个事务中被修改。第二个事务将永远挂起,直到第一个事务被提交。
事务等待的原因是由于第一个事务持有的 LCK_M_S 键锁。
在我的第二个测试中,一个修改表 3 中一行的事务已启动,但尚未提交,就像在第一个测试中一样。另一个事务正在插入到表 4 中,引用同一行的列在表 3 的第一个事务中被修改。除了这一次,表四引用表三中的代理键而不是主键。交易立即完成,不受第一笔交易的影响。
我需要帮助理解为什么在引用在第一个事务中修改的表的单独表中插入一行时,后一个事务总是被前一个事务阻止。我认为明显无益的答案是由于外键约束。但为什么?尤其是因为这是快照隔离,为什么后者的事务完全关心前者呢?它引用的行已经存在,并且外键可以很容易地验证,正如第二个测试所证明的那样,其中引用代理键的外键可以顺利完成。
sql - 由于选定行的更新冲突,快照隔离事务中止
由于更新冲突,快照隔离事务中止。您不能使用快照隔离直接或间接访问数据库中的表来更新、删除或插入已被另一个事务修改或删除的行。重试事务或更改更新/删除语句的隔离级别。
我读了这里提到的其他问题,但我的有点不同,我只是想用 select 语句读取一些数据,但是如果这些选定的行在外部用另一个事务更新,那么我会遇到冲突错误。
如果我尝试使用LDPLOCK
提示,那么它会起作用,但会减慢它的速度。有什么解决方案吗?
下面的实际例子。
现在,如果我在完成上述事务提交之前还对员工表执行更新,则会引发上述错误。我不知道为什么,因为它只是选择语句。我阅读了微软的博客,说这会产生问题,但在任何地方都找不到解决方案。