在 SQL 服务器中设置读取已提交快照时如何避免死锁?
How do I avoid a deadlock while setting read committed snapshot off in SQL Server?
对于测试场景,我需要在 SQL 服务器实例上关闭读取已提交的快照。测试后我需要恢复更改。我使用 IF 语句来确定要执行的操作。这是我使用的脚本:
USE [master]
GO
IF 'Mycondition'
BEGIN
ALTER DATABASE [MyDB] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
ALTER DATABASE [MyDB] SET READ_COMMITTED_SNAPSHOT OFF WITH NO_WAIT
ALTER DATABASE [MyDB] SET MULTI_USER WITH NO_WAIT
END
ELSE
BEGIN
ALTER DATABASE [MyDB] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
ALTER DATABASE [MyDB] SET READ_COMMITTED_SNAPSHOT ON WITH NO_WAIT
ALTER DATABASE [MyDB] SET MULTI_USER WITH NO_WAIT
END
GO
但是,在 运行 这个脚本上,似乎间歇性地出现了死锁。有时操作会通过,而有时会发生死锁,我的数据库停留在单用户模式。无论如何我可以确保不会发生这种情况吗?我考虑过删除 WITH NO_WAIT
子句,但这似乎没有帮助。
看起来我在删除 WITH NO_WAIT
子句时遗漏了什么。当我删除它时它工作正常。
对于测试场景,我需要在 SQL 服务器实例上关闭读取已提交的快照。测试后我需要恢复更改。我使用 IF 语句来确定要执行的操作。这是我使用的脚本:
USE [master]
GO
IF 'Mycondition'
BEGIN
ALTER DATABASE [MyDB] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
ALTER DATABASE [MyDB] SET READ_COMMITTED_SNAPSHOT OFF WITH NO_WAIT
ALTER DATABASE [MyDB] SET MULTI_USER WITH NO_WAIT
END
ELSE
BEGIN
ALTER DATABASE [MyDB] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
ALTER DATABASE [MyDB] SET READ_COMMITTED_SNAPSHOT ON WITH NO_WAIT
ALTER DATABASE [MyDB] SET MULTI_USER WITH NO_WAIT
END
GO
但是,在 运行 这个脚本上,似乎间歇性地出现了死锁。有时操作会通过,而有时会发生死锁,我的数据库停留在单用户模式。无论如何我可以确保不会发生这种情况吗?我考虑过删除 WITH NO_WAIT
子句,但这似乎没有帮助。
看起来我在删除 WITH NO_WAIT
子句时遗漏了什么。当我删除它时它工作正常。