以下陈述:
INSERT INTO dbo.Changes([Content], [Date], [UserId], [CompanyId])
VALUES (@1, @2, @3, @4);
SELECT @@identity;
Run Code Online (Sandbox Code Playgroud)
给我这个SQL错误3960:
由于更新冲突,快照隔离事务中止.您不能使用快照隔离直接或间接访问数据库'myDatabase'中的表'dbo.Companies'来更新,删除或插入已被其他事务修改或删除的行.重试事务或更改update/delete语句的隔离级别.
据我所知,从错误消息中,我不应该dbo.Companies在另一个连接修改期间更新,删除或插入表dbo.Companies.
但是为什么当我将一个新行插入另一个表dbo.Changes(具有外键dbo.Companies)并且我没有删除引用的行时,它会发生dbo.Companies,但我只是更新行dbo.Companies而不是主键?这应该可行,不应该吗?(这是SQL Server中的错误吗?)
更新:
表如下所示:
dbo.Changes([Id] int PK, [Content] nvarchar,
[Date] datetime, [UserId] int, [CompanyId] int -> dbo.Companies.[Id])
dbo.Companies([Id] int PK, [Name] nvarchar)
Run Code Online (Sandbox Code Playgroud)
第二次更新正在做:
UPDATE dbo.Companies WHERE [Id] = @1 SET [Name] = @2;
Run Code Online (Sandbox Code Playgroud) t-sql sql-server transactions transaction-isolation snapshot-isolation
In Microsoft SQL Server, I use the READ_COMMITTED_SNAPSHOT ISOLATION
ALTER DATABASE MyDatabase
SET ALLOW_SNAPSHOT_ISOLATION ON
ALTER DATABASE MyDatabase
SET READ_COMMITTED_SNAPSHOT ON
Run Code Online (Sandbox Code Playgroud)
In Session 1,update the Principal from 4000 to 5000
BEGIN TRAN
Update MyTable Set Principal=5000 Where InvestorId=10
Run Code Online (Sandbox Code Playgroud)
Now in Session 2, I say
Select Principal from MyTable where InvestorId=10
Run Code Online (Sandbox Code Playgroud)
I get 4000, since the Session 1 Transaction is not committed.
If I do not use the READ_COMMITTED_SNAPSHOT isolation mode, and use
sql oracle snapshot-isolation isolation-level read-committed-snapshot
有人可以向我解释一下数据库事务理论中“写偏斜”和“丢失更新”之间的确切区别吗?有人可以举个例子吗?
我在一个系统中遇到了一个有趣的问题,由于架构更改,单个线程中的第一个数据库事务阻止第二个数据库事务完成,直到发生超时。
为了测试这个,我创建了一个测试数据库:
CREATE DATABASE StackOverflow
GO
USE StackOverflow
ALTER DATABASE StackOverflow SET ALLOW_SNAPSHOT_ISOLATION ON
ALTER DATABASE StackOverflow SET READ_COMMITTED_SNAPSHOT ON WITH ROLLBACK IMMEDIATE
GO
CREATE TABLE One (
Id int CONSTRAINT pkOne PRIMARY KEY,
A varchar(10) NOT NULL
)
CREATE TABLE Two (
Id int CONSTRAINT pkTwo PRIMARY KEY,
B varchar(10) NOT NULL,
OneId int NOT NULL CONSTRAINT fkTwoToOne REFERENCES One
)
GO
-----------------------------------------------
CREATE TABLE Three (
Id int CONSTRAINT pkThree PRIMARY KEY,
SurrogateId int NOT NULL CONSTRAINT ThreeSurrUnique …Run Code Online (Sandbox Code Playgroud) 快照隔离功能可帮助我们解决读者锁定高容量站点上的编写器的问题.它是通过在SqlServer中使用tempdb对行进行版本控制来实现的.
我的问题是正确实现此快照隔离功能,只是在我的SqlServer上执行以下操作
ALTER DATABASE MyDatabase
SET ALLOW_SNAPSHOT_ISOLATION ON
ALTER DATABASE MyDatabase
SET READ_COMMITTED_SNAPSHOT ON
Run Code Online (Sandbox Code Playgroud)
我是否还必须编写包含TransactionScope的代码,例如
using (new TransactionScope(TransactionScopeOption.Required,
new TransactionOptions { IsolationLevel = IsolationLevel.SnapShot}))
Run Code Online (Sandbox Code Playgroud)
最后,布伦特在本文的 "隐藏的并发成本"一节中指出了他的关注,他提到在tempdb中对行进行版本化时,tempdb可能会用完空间,并且可能会出现性能问题,因为它必须查找版本化的行.所以我的问题是我知道这个网站使用快照隔离,其他人在大型网站上使用此功能,你对性能有何看法?
雷,雷.
试图了解事务隔离级别如何在 SQL Server 内存优化表(内存中 oltp)上工作。
如果我执行以下查询:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
BEGIN TRANSACTION
SELECT *
FROM tm.Tasks
Run Code Online (Sandbox Code Playgroud)
显示错误消息:
只有自动提交事务才支持使用 READ COMMITTED 隔离级别访问内存优化表。它不支持显式或隐式事务。使用表提示为内存优化表提供受支持的隔离级别,例如 WITH (SNAPSHOT)。
现在,如果我通过添加表提示来修改查询,它会起作用:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
GO
BEGIN TRANSACTION
SELECT *
FROM tm.Tasks WITH(SNAPSHOT)
Run Code Online (Sandbox Code Playgroud)
但是,如果我通过更改事务隔离级别SET TRANSACTION ISOLATION LEVEL SNAPSHOT并删除表提示:
SET TRANSACTION ISOLATION LEVEL SNAPSHOT
BEGIN TRANSACTION
SELECT *
FROM tm.Tasks
Run Code Online (Sandbox Code Playgroud)
它不再工作,显示错误消息:
当会话 TRANSACTION ISOLATION LEVEL 设置为 SNAPSHOT 时,无法访问或创建内存优化表和本机编译模块。
为什么它与表提示一起工作,并通过设置事务隔离级别
SET TRANSACTION ISOLATION LEVEL SNAPSHOT
Run Code Online (Sandbox Code Playgroud)
才不是?
更新:尝试设置MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT为ON,仍然从上次查询中得到相同的错误:
当会话 …
sql-server snapshot-isolation memory-optimized-tables sql-server-2016 in-memory-oltp
我正在开展一个学校项目,现在需要根据不同的隔离级别来描述MySQL的性能.我已经在READ UNCOMMITTED,READ COMMITTED,REPEATABLE READ和SERIALIZABLE上测试了一些东西.现在我想使用快照隔离测试一些东西.
我理解当在InnoDB中使用REPEATABLE READ的默认值时,快照隔离是一起使用的,但我想知道,是否可以将隔离级别设置为仅隔离快照?我该怎么办?
我将在SSMS for SQL Server 2008 R2中执行哪些SQL以了解数据库中是否已打开SNAPSHOT隔离级别?
我想在每次运行单元测试时创建一个数据库快照并将数据库恢复到它。我能够创建快照,但在恢复它时,我在执行时遇到以下错误。
消息 5070,级别 16,状态 2,第 1
行当其他用户正在使用数据库“ImportData”时,无法更改数据库状态消息 3013,级别 16,状态 1,第 1 行
RESTORE DATABASE 异常终止。
下面列出了用于创建和恢复数据库到快照的 SQL 查询。
创建快照:
CREATE DATABASE Data_SShot
ON (NAME=Data,
FILENAME='C:\Snapshot\DataSnapshot.ss'),
(NAME=Data_Data1,
FILENAME='C:\Snapshot\Data1Snapshot.ss'),
(NAME=Data_Index1,
FILENAME='C:\Snapshot\DataIndexSnapshot.ss')
AS SNAPSHOT OF Data
Run Code Online (Sandbox Code Playgroud)
恢复到快照
use master
go
RESTORE DATABASE Data
FROM DATABASE_SNAPSHOT = 'Data_SShot'
Run Code Online (Sandbox Code Playgroud)
它指出
当其他用户正在使用数据库时,不能更改数据库状态
如何克服这个问题?我正在使用 .NET (C#) 来做到这一点。如何关闭连接才能RESTORE DATABASE成功运行?
我希望创建快照并将数据库恢复到它的整个过程在测试套件中的每个测试中发生。