运行需要多长时间
ALTER DATABASE [MySite] SET READ_COMMITTED_SNAPSHOT ON
我只运行了10分钟。
如何检查它是否适用?
Answers:
您可以使用以下命令检查READ_COMMITTED_SNAPSHOT设置的状态 sys.databases
视图。检查is_read_committed_snapshot_on
列的值。已问及答。
至于持续时间,联机丛书指出,发生这种情况时,无法与数据库建立任何其他连接,但是它不需要单用户模式。因此,您可能会被其他活动连接阻止。运行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
的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中搜索“促销” 。
除非您执行特殊的操作(例如连接到外部数据库(或第二个数据库)),否则创建新的DataContext这样简单的操作都会导致这种情况。我有一个缓存,在初始化时“缓存”它自己的数据上下文,这试图将事务升级到一个完全分布式的事务。
解决方案很简单:
using (var tran = new TransactionScope(TransactionScopeOption.Suppress))
{
using (var shipDB = new ShipperDBDataContext())
{
// initialize cache
}
}
READ_COMMITTED_SNAPSHOT
独立于打开ALLOW_SNAPSHOT_ISOLATION
。你可以ALLOW_SNAPSHOT_ISOLATION
关闭,仍然从中受益READ_COMMITTED_SNAPSHOT
成为上。已测试:Microsoft SQL Server 2012-11.0.2100.60
试试这个代码:
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 '
当我将数据库更改为单用户时,我没有花一点时间