Tatsache Serializable
ist, dass die Standardeinstellung aus Zeiten stammt, in denen .NET noch nicht einmal (vor dem Jahr 1999) aus der DTC- Programmierung ( Distributed Transaction Coordinator ) veröffentlicht wurde.
DTC verwendet eine native ISOLATIONLEVEL- Aufzählung:
ISOLATIONLEVEL_SERIALIZABLE
Von einer aktuellen Transaktion gelesene Daten können erst nach Abschluss der aktuellen Transaktion von einer anderen Transaktion geändert werden. Es können keine neuen Daten eingefügt werden, die sich auf die aktuelle Transaktion auswirken würden. Dies ist die sicherste Isolationsstufe und die Standardeinstellung, ermöglicht jedoch die niedrigste Parallelitätsstufe.
.NET TransactionScope
basiert auf diesen Technologien.
Die nächste Frage lautet nun: Warum wird DTC ISOLATIONLEVEL_SERIALIZABLE
als Standardtransaktionsstufe definiert ? Ich nehme an, das liegt daran, dass DTC um das Jahr 1995 herum entworfen wurde (sicher vor 1999). Zu dieser Zeit war der SQL-Standard SQL-92 (oder SQL2).
Und hier ist, was SQL-92 über Transaktionsebenen sagt:
Eine SQL-Transaktion hat eine Isolationsstufe, die READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ oder SERIALIZABLE lautet. Die Isolationsstufe einer SQL-Transaktion definiert den Grad, in dem die Operationen auf SQL-Daten oder Schemas in dieser SQL-Transaktion von den Auswirkungen von Operationen auf SQL-Daten oder Schemas in gleichzeitigen SQL-Transaktionen beeinflusst werden und diese beeinflussen können. Die Isolationsstufe einer SQL-Transaktion ist standardmäßig SERIALIZABLE . Die Ebene kann explizit von der festgelegt werden <set transaction statement>
.
Die Ausführung von gleichzeitigen SQL-Transaktionen auf Isolationsebene SERIALIZABLE ist garantiert serialisierbar. Eine serialisierbare Ausführung ist definiert als eine Ausführung der Operationen der gleichzeitigen Ausführung von SQL-Transaktionen, die den gleichen Effekt wie eine serielle Ausführung derselben SQL-Transaktionen erzeugt. Eine serielle Ausführung ist eine Ausführung, bei der jede SQL-Transaktion vollständig ausgeführt wird, bevor die nächste SQL-Transaktion beginnt.