Teilen über


Behandlungsdatenbankparallelität gibt in Updategrams (SQLXML 4.0) heraus

Gilt für: SQL Server Azure SQL-Datenbank

Wie andere Datenbankupdatemechanismen müssen Updategrams gleichzeitige Updates von Daten in einer Mehrbenutzerumgebung verarbeiten können. Updategrams verwenden die Steuerung durch vollständige Parallelität, bei der ausgewählte Felddaten als Momentaufnahmen verglichen werden, um sicherzustellen, dass die zu aktualisierenden Daten seit ihrem letzten Abruf aus der Datenbank nicht von einer anderen Benutzeranwendung geändert wurden. Aktualisierungsdiagramme enthalten diese Momentaufnahmenwerte im <before-Block> der Updategrams. Vor dem Aktualisieren der Datenbank überprüft das Updatediagramm die Werte, die im <Before-Block> angegeben sind, anhand der Werte, die sich derzeit in der Datenbank befinden, um sicherzustellen, dass die Aktualisierung gültig ist.

Die Steuerung durch vollständige Parallelität bietet drei Ebenen des Schutzes in einem Updategram: Niedrig (kein), mittel und hoch. Sie können entscheiden, welche Ebene des Schutzes Sie benötigen, indem Sie das Updategram entsprechend festlegen.

Niedrigste Ebene des Schutzes

Diese Ebene ist ein blindes Update, bei dem das Update ohne Verweis auf andere Updates verarbeitet wird, die seit dem letzten Lesen der Datenbank vorgenommen wurden. In einem solchen Fall geben Sie nur die Primärschlüsselspalte(n) im <vorher> blockierten Block an, um den Datensatz zu identifizieren, und Sie geben die aktualisierten Informationen im <After-Block> an.

Die neue Telefonnummer des Kontakts im folgenden Updategram ist beispielsweise korrekt, unabhängig davon, welche Telefonnummer davor verwendet wurde. Beachten Sie, wie der <Vorblock> nur die Primärschlüsselspalte (ContactID) angibt.

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">  
<updg:sync >  
<updg:before>  
   <Person.Contact ContactID="1" />  
</updg:before>  
<updg:after>  
   <Person.Contact ContactID="1" Phone="111-111-1111" />  
</updg:after>  
</updg:sync>  
</ROOT>  

Mittlere Ebene des Schutzes

Bei dieser Ebene des Schutzes vergleicht das Updategram die aktuellen Werte der Daten, die mit den Werten in den Datenbankspalten aktualisiert werden, um sicherzustellen, dass die Werte seit dem Lesen des Datensatzes durch Ihre Transaktion durch keine andere Transaktion geändert wurden.

Sie können diese Schutzebene erhalten, indem Sie die Primärschlüsselspalten und die Spalten angeben, die Sie im <vorherigen> Block aktualisieren.

Bei diesem Updategam wird beispielsweise der Wert in der Spalte Phone der Tabelle Person.Contact für den Kontakt mit der ContactID 1 geändert. Der <Vorblock> gibt das Phone-Attribut an, um sicherzustellen, dass dieser Attributwert dem Wert in der entsprechenden Spalte in der Datenbank entspricht, bevor der aktualisierte Wert angewendet wird.

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">  
<updg:sync >  
<updg:before>  
   <Person.Contact ContactID="1" Phone="398-555-0132" />  
</updg:before>  
<updg:after>  
   <Person.Contact ContactID="1" Phone="111-111-1111" />  
</updg:after>  
</updg:sync>  
</ROOT>  

Höchste Ebene des Schutzes

Eine hohe Ebene des Schutzes stellt sicher, dass der Datensatz seit dem letzten Lesen dieses Datensatzes durch Ihre Anwendung gleich geblieben ist (d. h. seitdem Ihre Anwendung den Datensatz gelesen hat, wurde er von keiner anderen Transaktion geändert).

Es gibt zwei Methoden, diese hohe Ebene des Schutzes gegen gleichzeitige Updates zu erreichen:

  • Geben Sie zusätzliche Spalten in der Tabelle im <vorherigen> Block an.

    Wenn Sie zusätzliche Spalten im <vorherigen> Block angeben, vergleicht das Updatediagramm die Werte, die für diese Spalten angegeben sind, mit den Werten, die sich in der Datenbank befanden, bevor die Aktualisierung angewendet wird. Wenn eine der Datensatzspalten seit dem letzten Lesen des Datensatzes durch Ihre Transaktion geändert wurde, wird das Update vom Updategram nicht durchgeführt.

    Das folgende Updategram aktualisiert z. B. den Schichtnamen, gibt jedoch zusätzliche Spalten (StartTime,EndTime) im <vorherigen> Block an, wodurch ein höherer Schutz vor gleichzeitigen Updates angefordert wird.

    <ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">  
    <updg:sync >  
    <updg:before>  
       <HumanResources.Shift ShiftID="1"   
                 Name="Day"   
                 StartTime="1900-01-01 07:00:00.000"   
                 EndTime="1900-01-01 15:00:00.000" />  
    </updg:before>  
    <updg:after>  
       <HumanResources.Shift Name="Morning" />  
    </updg:after>  
    </updg:sync>  
    </ROOT>  
    

    In diesem Beispiel wird die höchste Schutzebene angegeben, indem alle Spaltenwerte für den Datensatz im <vorherigen> Block angegeben werden.

  • Geben Sie die Zeitstempelspalte (sofern verfügbar) im <vorherigen> Block an.

    Anstatt alle Datensatzspalten im <vorherigen> Block anzugeben, können Sie einfach die Zeitstempelspalte (sofern die Tabelle einen hat) zusammen mit den Primärschlüsselspalten im< vorherigen> Block angeben. Die Datenbank aktualisiert nach jedem Update des Datensatzes die timestamp-Spalte auf einen eindeutigen Wert. In diesem Fall vergleicht das Updategram den Wert des Timestamps mit dem zugehörigen Wert in der Datenbank. Der in der Datenbank gespeicherte Timestampwert ist ein Binärwert. Daher muss die Zeitstempelspalte im Schema als dt:type="bin.hex", dt:type="bin.base64" oder sql:datatype="timestamp" angegeben werden. (Sie können entweder den XML-Datentyp oder den Microsoft SQL Server-Datentyp angeben.)

So testen Sie das Updategram

  1. Erstellen Sie diese Tabelle in der tempdb-Datenbank :

    USE tempdb  
    CREATE TABLE Customer (  
                 CustomerID  varchar(5),  
                 ContactName varchar(20),  
                 LastUpdated timestamp)  
    
  2. Fügen Sie diesen Beispieldatensatz hinzu:

    INSERT INTO Customer (CustomerID, ContactName) VALUES   
                         ('C1', 'Andrew Fuller')  
    
  3. Kopieren Sie das folgende XSD-Schema, und fügen Sie es in den Editor ein. Speichern Sie es unter dem Namen ConcurrencySampleSchema.xml:

    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"  
                xmlns:sql="urn:schemas-microsoft-com:mapping-schema">  
      <xsd:element name="Customer" sql:relation="Customer" >  
       <xsd:complexType>  
            <xsd:attribute name="CustomerID"    
                           sql:field="CustomerID"   
                           type="xsd:string" />   
    
            <xsd:attribute name="ContactName"    
                           sql:field="ContactName"   
                           type="xsd:string" />  
    
            <xsd:attribute name="LastUpdated"   
                           sql:field="LastUpdated"   
                           type="xsd:hexBinary"   
                 sql:datatype="timestamp" />  
    
        </xsd:complexType>  
      </xsd:element>  
    </xsd:schema>  
    
  4. Kopieren Sie den folgenden Updategramcode in Editor, und speichern Sie ihn unter dem Namen ConcurrencySampleTemplate.xml im selben Verzeichnis, in dem Sie das im vorherigen Schritt erstellte Schema gespeichert haben. (Beachten Sie, dass der unten aufgeführte Timestampwert für LastUpdated sich von dem in Ihrer Customer-Tabelle unterscheidet. Kopieren Sie daher den tatsächlichen Wert für LastUpdated aus der Tabelle, und fügen Sie ihn in das Updategram ein.)

    <ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">  
    <updg:sync mapping-schema="SampleSchema.xml" >  
    <updg:before>  
       <Customer CustomerID="C1"   
                 LastUpdated = "0x00000000000007D1" />  
    </updg:before>  
    <updg:after>  
       <Customer ContactName="Robert King" />  
    </updg:after>  
    </updg:sync>  
    </ROOT>  
    
  5. Erstellen und verwenden Sie das SQLXML 4.0-Testskript (Sqlxml4test.vbs), um die Vorlage auszuführen.

    Weitere Informationen finden Sie unter Verwenden von ADO zum Ausführen von SQLXML 4.0-Abfragen.

Dies ist das entsprechende XDR-Schema:

<?xml version="1.0" ?>  
<Schema xmlns="urn:schemas-microsoft-com:xml-data"  
        xmlns:dt="urn:schemas-microsoft-com:datatypes"  
        xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
<ElementType name="Customer" sql:relation="Customer" >  
    <AttributeType name="CustomerID" />  
    <AttributeType name="ContactName" />  
    <AttributeType name="LastUpdated"  dt:type="bin.hex"   
                                       sql:datatype="timestamp" />  
    <attribute type="CustomerID" />  
    <attribute type="ContactName" />  
    <attribute type="LastUpdated" />  
</ElementType>  
</Schema>  

Weitere Informationen

Sicherheitsüberlegungen zu Updategramms (SQLXML 4.0)