运行需要多长时间
ALTER DATABASE [MySite] SET READ_COMMITTED_SNAPSHOT ON
我刚刚运行它,它需要 10 分钟。
如何检查它是否已应用?
运行需要多长时间
ALTER DATABASE [MySite] SET READ_COMMITTED_SNAPSHOT ON
我刚刚运行它,它需要 10 分钟。
如何检查它是否已应用?
sys.databases
您可以使用视图检查 READ_COMMITTED_SNAPSHOT 设置的状态。检查is_read_committed_snapshot_on
列的值。已经问和回答了。
至于持续时间,Books Online 声明在发生这种情况时不能有任何其他连接到数据库,但它不需要单用户模式。因此,您可能会被其他活动连接阻止。运行sp_who
(或sp_who2
)以查看还有什么连接到该数据库。
试试这个:
ALTER DATABASE generic SET READ_COMMITTED_SNAPSHOT ON WITH ROLLBACK IMMEDIATE
好的(我是最初的提问者)所以事实证明我什至没有启用该死的东西。
这是运行以启用快照模式并确保它已启用的最终代码。
SELECT is_read_committed_snapshot_on, snapshot_isolation_state_desc,snapshot_isolation_state FROM sys.databases WHERE name='shipperdb'
ALTER DATABASE shipperdb SET allow_snapshot_isolation ON
ALTER DATABASE shipperdb SET SINGLE_USER WITH ROLLBACK IMMEDIATE
ALTER DATABASE shipperdb SET read_committed_snapshot ON
ALTER DATABASE shipperdb SET MULTI_USER
SELECT is_read_committed_snapshot_on, snapshot_isolation_state_desc,snapshot_isolation_state FROM sys.databases WHERE name='shipperdb'
即使连接处于活动状态,这也适用(大概你对他们被踢出没问题)。
您可以看到之前和之后的状态,这应该几乎立即运行。
重要的:
上面的选项 READ_COMMITTED_SNAPSHOT 对应于 .NET 中的 IsolationLevel.ReadCommitted
上面的选项 ALLOW_SNAPSHOT_ISOLATION 对应于 .NET 中的 IsolationLevel.Snapshot
.NET 提示:
Isolationlevel.ReadCommitted
即使数据库未启用,看起来也允许在代码中使用。不会引发任何警告。所以帮自己一个忙,并确保它在你认为它像我一样持续 3 年之前打开!!!!
如果您使用的是 C#,您可能需要ReadCommitted
IsolationLevel 而不是Snapshot
- 除非您在此事务中进行写入。
READ COMMITTED SNAPSHOT
做乐观读和悲观写。相反,SNAPSHOT
乐观读取和乐观写入。(从这里)
bool snapshotEnabled = true;
using (var t = new TransactionScope(TransactionScopeOption.Required,
new TransactionOptions
{
IsolationLevel = IsolationLevel.ReadCommitted
}))
{
using (var shipDB = new ShipperDBDataContext())
{
}
}
此外,您可能会收到有关“无法促进”交易的错误。在 .NET Framework 2.0 中的 System.Transactions 简介中搜索“promotion” 。
除非您正在做一些特殊的事情,例如连接到外部数据库(或第二个数据库),否则像创建新 DataContext 这样简单的事情可能会导致这种情况。我有一个缓存,它在初始化时“启动”它自己的数据上下文,这试图将事务升级到一个完整的分布式事务。
解决方案很简单:
using (var tran = new TransactionScope(TransactionScopeOption.Suppress))
{
using (var shipDB = new ShipperDBDataContext())
{
// initialize cache
}
}
试试这个代码:
if(charindex('Microsoft SQL Server 2005',@@version) > 0)
begin
declare @sql varchar(8000)
select @sql = '
ALTER DATABASE ' + DB_NAME() + ' SET SINGLE_USER WITH ROLLBACK IMMEDIATE ;
ALTER DATABASE ' + DB_NAME() + ' SET READ_COMMITTED_SNAPSHOT ON;
ALTER DATABASE ' + DB_NAME() + ' SET MULTI_USER;'
Exec(@sql)
end
我尝试了命令:
ALTER DATABASE MyDB SET READ_COMMITTED_SNAPSHOT ON
GO
针对一个开发盒,但它花了 10 多分钟,所以我杀了它。
然后我发现了这个:
https://willwarren.com/2015/10/12/sql-server-read-committed-snapshot/
并使用他的代码块(运行大约需要 1:26):
USE master
GO
/**
* Cut off live connections
* This will roll back any open transactions after 30 seconds and
* restricts access to the DB to logins with sysadmin, dbcreator or
* db_owner roles
*/
ALTER DATABASE MyDB SET RESTRICTED_USER WITH ROLLBACK AFTER 30 SECONDS
GO
-- Enable RCSI for MyDB
ALTER DATABASE MyDB SET READ_COMMITTED_SNAPSHOT ON
GO
-- Allow connections to be established once again
ALTER DATABASE MyDB SET MULTI_USER
GO
-- Check the status afterwards to make sure it worked
SELECT is_read_committed_snapshot_on
FROM sys.databases
WHERE [name] = 'MyDB '
在更改当前数据库之前尝试使用 master 数据库。
USE Master
GO
ALTER DATABASE [YourDatabase] SET READ_COMMITTED_SNAPSHOT ON
GO
当我将数据库更改为单用户时,我没有花一秒钟时间
您需要做的就是:ALTER DATABASE xyz SET READ_COMMITTED_SNAPSHOT ON WITH ROLLBACK IMMEDIATE;
无需将数据库置于单用户模式。不过,您将回滚未提交的事务。
尝试关闭其他 SQL 服务,以便只有 SQL 服务器服务正在运行。
我的运行了 5 分钟,然后我取消了它,因为很明显没有发生任何事情。它是一个全新的服务器,因此没有其他用户连接。我关闭了 SQL Reporting Services,然后再次运行它。不到一秒钟就完成了。