2010-08-21 4 views
6

Ich habe System.Transactions Namespace gesehen, und fragte mich, kann ich tatsächlich eine RDMBS mit dieser Namespace-Nutzung machen?Was ist der praktische Nutzen von System.Transactions?

Aber als ich ein paar Beispiele sah, verstehe ich nicht, wie System.Transactions etwas über den einfachen Versuch hinaus tut und uns Erfolg/Misserfolg bringt?

Dies ist das Beispiel auf der MSDN-Website, ich weiß, es kann sehr einfach sein, aber ich bin nicht in der Lage, den Nutzen in diesem Beispiel zu verstehen, kann mir jemand sagen, was ist der Unterschied zwischen einfachen versuchen/fangen und Transaktionsumfang in diesem Beispiel .

Wenn ich ein RDBMS erstellen (meine eigenen RDMBS erstellen), ich verstehe, müssen wir viele Protokolle auf die Festplatte der Operationen, die wir ausführen, und am Ende machen wir diese Operationen im Falle von Rollback, aber hier gibt es nichts, etwas zu annullieren.

// This function takes arguments for 2 connection strings and commands to create a transaction 
// involving two SQL Servers. It returns a value > 0 if the transaction is committed, 0 if the 
// transaction is rolled back. To test this code, you can connect to two different databases 
// on the same server by altering the connection string, or to another 3rd party RDBMS by 
// altering the code in the connection2 code block. 
static public int CreateTransactionScope(
    string connectString1, string connectString2, 
    string commandText1, string commandText2) 
{ 
    // Initialize the return value to zero and create a StringWriter to display results. 
    int returnValue = 0; 
    System.IO.StringWriter writer = new System.IO.StringWriter(); 

    try 
    { 
     // Create the TransactionScope to execute the commands, guaranteeing 
     // that both commands can commit or roll back as a single unit of work. 
     using (TransactionScope scope = new TransactionScope()) 
     { 
      using (SqlConnection connection1 = new SqlConnection(connectString1)) 
      { 
       // Opening the connection automatically enlists it in the 
       // TransactionScope as a lightweight transaction. 
       connection1.Open(); 

       // Create the SqlCommand object and execute the first command. 
       SqlCommand command1 = new SqlCommand(commandText1, connection1); 
       returnValue = command1.ExecuteNonQuery(); 
       writer.WriteLine("Rows to be affected by command1: {0}", returnValue); 

       // If you get here, this means that command1 succeeded. By nesting 
       // the using block for connection2 inside that of connection1, you 
       // conserve server and network resources as connection2 is opened 
       // only when there is a chance that the transaction can commit. 
       using (SqlConnection connection2 = new SqlConnection(connectString2)) 
       { 
        // The transaction is escalated to a full distributed 
        // transaction when connection2 is opened. 
        connection2.Open(); 

        // Execute the second command in the second database. 
        returnValue = 0; 
        SqlCommand command2 = new SqlCommand(commandText2, connection2); 
        returnValue = command2.ExecuteNonQuery(); 
        writer.WriteLine("Rows to be affected by command2: {0}", returnValue); 
       } 
      } 

      // The Complete method commits the transaction. If an exception has been thrown, 
      // Complete is not called and the transaction is rolled back. 
      scope.Complete(); 

     } 

    } 
    catch (TransactionAbortedException ex) 
    { 
     writer.WriteLine("TransactionAbortedException Message: {0}", ex.Message); 
    } 
    catch (ApplicationException ex) 
    { 
     writer.WriteLine("ApplicationException Message: {0}", ex.Message); 
    } 

    // Display messages. 
    Console.WriteLine(writer.ToString()); 

    return returnValue; 
} 

In obigem Beispiel, was machen wir? Ich denke, SQL Client-Bibliothek wird alles richtig machen? Bedeutet dies, dass System.IO.StringWriter entweder den gesamten Erfolgstext oder den gesamten Fehlertext enthält? oder gibt es eine Sperre zwischen dem Umfang von TransactionScope?

+0

Was meinst du mit "make a RDBMS"? – nos

+0

Relationales Datenbank-Management-System, Kopie von SQL Server oder MySQL oder Oracle, ich meine, wenn ich mein eigenes XYZSql Datenbanksystem auf .net machen möchte, kann ich das dann benutzen? –

+1

Nicht wirklich, aber Sie könnten Unterstützung für System.Transactions in Ihrem .NET XYZSql ADO.NET-Treiber implementieren, wenn Ihr neues XYZSql-Datenbanksystem Transaktionen unterstützt. – nos

Antwort

3

Zunächst TransactionScope ist nicht das gleiche wie versuchen/fangen. TransactionScope ist der Name einer Transaktion. Die Transaktion im Bereich muss explizit durch den Aufruf von Complete für den Bereich festgelegt werden. Jeder andere Fall (einschließlich der Ausnahme, die im Gültigkeitsbereich ausgelöst wird) führt dazu, dass der Block verwendet wird, der den Bereich zur Verfügung stellt und implizit die unvollständige Transaktion zurücksetzt, aber die Ausnahme nicht verarbeitet.

In grundlegenden Szenarien verhält sich die Transaktion von System.Transactions genauso wie die Transaktion db client. System.Transactions bietet die folgenden zusätzlichen Funktionen:

  • API agnostisch. Sie können den gleichen Transaktionsbereich für Oracle, SQL Server oder Web-Service verwenden. Dies ist wichtig, wenn Ihre Transaktion in Schicht gestartet wird, die Persistenz ignorant ist (keine Informationen über Persistenz-Implementierung bekannt ist).
  • Automatische Eintragung. Wenn für die Verbindungszeichenfolge angegeben (Standardverhalten). Die neue Datenbankverbindung wird automatisch in die bestehende Transaktion übernommen.
  • Automatische Heraufstufung zu verteilter Transaktion.Wenn sich die zweite Verbindung bei der Transaktion anmeldet, wird sie automatisch zu einer verteilten Verbindung befördert (MSDTC wird benötigt). Die Aktion funktioniert auch, wenn Sie andere koordinierte Ressourcen wie Transaktions-Webdienste registrieren.
  • usw.
1

Eine Transaktion wird die notwendige Sperrung für Sie tun. Außerdem gibt es ein implizites Rollback, wenn die Transaktion am Ende ihres Bereichs angeordnet ist, wenn sie nicht von Complete() übernommen wurde (wie von den Kommentaren vorgeschlagen). Für den Fall, dass eine Ausnahme auftritt, werden alle Operationen automatisch zurückgesetzt und es findet keine Änderung in der Datenbank statt. Wenn beispielsweise die zweite Abfrage fehlschlägt, werden auch die Änderungen der ersten Abfrage verworfen.

jedoch für den String, wird es noch Nachrichten an die Point of Failure enthält bis (zum Beispiel

Rows to be affected by command1: {0} 
ApplicationException Message: {0} 

können beide erscheinen in Ihrem Protokoll nach diesem Code.

Wie für ein RDBMS mit dem Erstellen Ich bin mir nicht wirklich sicher, ob ich Ihre Frage verstehe. Wenn Sie tatsächlich ein relationales Datenbankverwaltungssystem erstellen möchten, würde ich sagen, dass Sie wahrscheinlich an der falschen Stelle suchen. Wenn Sie meinen, dass Sie über Transaktion auf ein RDBMS zugreifen möchten, Ich würde sagen, es hängt von Ihren Bedürfnissen ab, dh wenn Sie Transaktionen benötigen, die garantieren, dass Ihre Anweisungen ausgeführt werden Bestellen und auf eine Alles-oder-nichts-Weise, dann ja, Transaction ist ein guter Anfang.

+0

Ja, ich beabsichtige, RDBMS zu erstellen, nicht verwenden, ich weiß, ich kann Datenbank-Client-Bibliothek-Transaktion wie SqlTransaction usw. verwenden. Aber ich verstehe immer noch nicht, was Sie mit der notwendigen Sperre verstehen, sehe ich es so, dass auch wenn ich Verwenden Sie TransactionScope hier nicht, ich werde immer noch das gleiche Ergebnis im Falle von irgendwelchen von Befehlen erhalten, scheitern richtig? –

+0

Entschuldigen Sie die Störung, meinen Sie, dass System.Transactions die an der Sql-Datenbank vorgenommenen Änderungen implizit rückgängig macht, auch wenn ich SqlTransaction in diesem Code nicht explizit verwendet habe? Das bedeutet, dass die Sql-Client-Bibliothek automatisch eine Instanz von SqlTransaction erstellt und sie verwendet, sodass System.Transactions praktisch nicht verwendet wird, wenn ich SqlTransaction direkt verwenden kann? –

+0

TransactionScope ist eine Abstraktion über SqlTransaction und kann andere Dinge als eine SqlTransaction, z. B. eine MSMQ-Transaktion, umfassen. – nos

Verwandte Themen