Sim*_*ver 73 sql-server isolation-level read-committed-snapshot
运行需要多长时间
ALTER DATABASE [MySite] SET READ_COMMITTED_SNAPSHOT ON
Run Code Online (Sandbox Code Playgroud)
我跑了它,花了10分钟.
如何检查是否已应用?
Ric*_*ick 65
您可以使用sys.databases视图检查READ_COMMITTED_SNAPSHOT设置的状态.检查is_read_committed_snapshot_on列的值.已经问过并回答了.
至于持续时间,联机丛书声明在发生这种情况时不能与数据库建立任何其他连接,但它不需要单用户模式.因此,您可能会被其他活动连接阻止.运行sp_who(或sp_who2)以查看还有哪些连接到该数据库.
小智 47
试试这个:
ALTER DATABASE generic SET READ_COMMITTED_SNAPSHOT ON WITH ROLLBACK IMMEDIATE
Run Code Online (Sandbox Code Playgroud)
Sim*_*ver 28
好的(我是原始的提问者)所以事实证明,我甚至没有启用这个问题.
这是运行以启用快照模式并确保启用快照模式的最终代码.
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'
Run Code Online (Sandbox Code Playgroud)
这种方法即使在连接处于活动状态时也能正常工作(大概你可以将它们踢出去).
您可以看到之前和之后的状态,这应该几乎立即运行.
重要:
上面的选项READ_COMMITTED_SNAPSHOT对应于IsolationLevel.ReadCommitted在.NET
上面的选项ALLOW_SNAPSHOT_ISOLATION对应于IsolationLevel.Snapshot在.NET
.NET技巧:
看起来像Isolationlevel.ReadCommitted在代码被允许,即使不是由数据库启用.没有警告.请你自己帮个忙,并确保在你认为它是3年之前它就像我一样!
如果你正在使用C#,你可能想要ReadCommittedIsolationLevel而不是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())
{
}
}
Run Code Online (Sandbox Code Playgroud)
另外,您可能会收到有关"无法宣传"交易的错误消息.在.NET Framework 2.0中引入System.Transactions中搜索"promotion" .
除非您正在做一些特殊的事情,比如连接到外部数据库(或第二个数据库),否则像创建新DataContext这样简单的事情就会导致这种情况.我有一个缓存,在初始化时"旋转"自己的datacontext,并且尝试将事务升级为完整的分布式事务.
解决方案很简单:
using (var tran = new TransactionScope(TransactionScopeOption.Suppress))
{
using (var shipDB = new ShipperDBDataContext())
{
// initialize cache
}
}
Run Code Online (Sandbox Code Playgroud)
试试这段代码:
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
Run Code Online (Sandbox Code Playgroud)
我尝试了命令:
ALTER DATABASE MyDB SET READ_COMMITTED_SNAPSHOT ON
GO
Run Code Online (Sandbox Code Playgroud)
对开发箱,但花了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 '
Run Code Online (Sandbox Code Playgroud)