OK (ich bin der ursprüngliche Frages) so stellt sich die ganze Zeit aus habe ich nicht einmal das haben Darn Ding aktiviert.
Hier ist der ultimate code zu laufen, um Snapshot-Modus zu aktivieren und sicherzustellen, dass es aktiviert ist.
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'
Dies funktioniert auch mit aktiven Verbindungen (vermutlich geht es ihnen gut, wenn sie rausgeschmissen werden).
Sie können den Status Vorher und Nachher sehen, und dieser sollte fast sofort ausgeführt werden.
WICHTIG:
Die Option READ_COMMITTED_SNAPSHOT oben IsolationLevel.ReadCommitted in .NET entspricht
Die Option ALLOW_SNAPSHOT_ISOLATION oben IsolationLevel.Snapshot in .NET entspricht
Great article about different versioning
.NET-Tipps:
Scheinbar ist Isolationlevel.ReadCommitted
im Code erlaubt, auch wenn nicht von der Datenbank aktiviert. Es wird keine Warnung ausgegeben. Also tun Sie sich einen Gefallen und stellen Sie sicher, dass es eingeschaltet ist, bevor Sie annehmen, dass es für 3 Jahre ist, wie ich es tat !!!Wenn Sie C# verwenden, möchten Sie wahrscheinlich ReadCommitted
IsolationLevel und nicht Snapshot
- es sei denn, Sie schreiben in dieser Transaktion.
READ COMMITTED SNAPSHOT
macht optimistische liest und pessimistische schreibt. Im Gegensatz dazu macht SNAPSHOT
optimistische Lesevorgänge und optimistische Schreibvorgänge. (from here)
bool snapshotEnabled = true;
using (var t = new TransactionScope(TransactionScopeOption.Required,
new TransactionOptions
{
IsolationLevel = IsolationLevel.ReadCommitted
}))
{
using (var shipDB = new ShipperDBDataContext())
{
}
}
In weiteren können Sie einen Fehler zu ‚nicht in der Lage zu fördern‘ eine Transaktion zu sein. Suchen Sie nach 'Aktion' in Introducing System.Transactions in the .NET Framework 2.0.
Wenn Sie nicht etwas Spezielles wie zum Beispiel eine Verbindung zu einer externen Datenbank (oder einer zweiten Datenbank) machen, kann das so einfach sein wie das Erstellen eines neuen DataContext. Ich hatte einen Cache, der bei der Initialisierung seinen eigenen Datenkontext "hochspulte" und dabei versuchte, die Transaktion zu einem vollständig verteilten zu eskalieren.
Die Lösung war einfach:
using (var tran = new TransactionScope(TransactionScopeOption.Suppress))
{
using (var shipDB = new ShipperDBDataContext())
{
// initialize cache
}
}
Siehe auch Deadlocked
article by @CodingHorror
hat es jemals fertig? –
lassen Sie mich überprüfen ... –
oops. war die ganze Zeit nicht aktiviert !! (Ernst!) Das erklärt die Deadlocks. Sehen Sie meine Antwort unten für die vollständigen Ergebnisse und ein besseres Skript zum Ausführen –