Udostępnij za pośrednictwem


Obsługa problemy współbieżności bazy danych w Updategrams (SQLXML 4.0)

Podobnie jak inne bazy danych należy zaktualizować mechanizmów, updategrams muszą radzić sobie z współbieżnych aktualizacji danych w wielu użytkowników środowiska.Updategrams użycie sterowania współbieżnością optymistycznego używa porównanie wybierz pole danych migawek w celu zapewnienia, że dane mają być aktualizowane nie został zmodyfikowany przez aplikację innego użytkownika od czasu odczytu z bazy danych.Obejmują one Updategrams migawka wartości w <before> Blok updategrams.Przed zaktualizowaniem bazy danych, wierzchołki sprawdza wartości, które są określone w <before> blok wartościami obecnie w bazie danych, upewnij się, czy aktualizacja jest prawidłowa.

Optymistycznego sterowania współbieżnością oferuje trzy poziomy ochrony w diagramach aktualizacji: niski (Brak), pośredniego i wysoki.Można zdecydować, jaki poziom ochrony należy odpowiednio określając wierzchołki.

Najniższy poziom ochrony

Ten poziom jest aktualizacja niewidomych, przetwarzania aktualizacji bez odniesienia do innych aktualizacji, które zostały dokonane od czasu ostatniego odczytu bazy danych.W takim przypadek należy określić tylko klucz podstawowy kolumn w <before> zablokować do identyfikowania rekordu i podaj aktualne informacje w <after> blok.

Na przykład nowy numer telefonu kontaktu w następujących wierzchołki jest poprawna, niezależnie od jakiego numeru telefonu został wcześniej.Obwieszczenie <before> blok określa tylko klucz podstawowy kolumna (BusinessEntityID).

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

Pośredni poziom ochrony

poziom ochrony wierzchołki porównuje bieżące wartości danych, aktualizowany o wartości kolumna bazy danych, aby zapewnić, że wartości nie zostały zmienione przez inne transakcje, ponieważ rekord przeczytana przez transakcję.

Ten poziom ochrony można uzyskać, określając klucz podstawowy kolumna i kolumna, którą aktualizujesz w <before> blok.

Na przykład ten wierzchołki zmienia wartość kolumna telefonu kontaktu z BusinessEntityID 1 tabela Person.Person.<before> Określa blok Telefon atrybut do zapewnienia, że ta wartość atrybut odpowiada wartości w odpowiednich kolumna w bazie danych, przed zastosowaniem zaktualizowanej wartości.

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

Wysoki poziom ochrony

Wysoki poziom ochrony zapewnia, że rekord pozostaje taki sam, ponieważ aplikacja ostatniego odczytu tego rekordu (oznacza to, że ponieważ aplikacja ma odczytu rekordu, nie został zmieniony przez innych transakcji).

Istnieją dwa sposoby, można uzyskać tę wysoką poziom ochrony przed równoczesnych aktualizacji:

  • Określić dodatkowe kolumny w tabela w <before> blok.

    Jeśli określić dodatkowe kolumny w <before> blok wierzchołki porównuje wartości, które są określone w tych kolumnach z wartościami, które były w bazie danych, przed zastosowaniem aktualizacji.Żadnych kolumn rekord został zmieniony od czasu transakcji odczytu rekordu, wierzchołki nie wykonuje aktualizacji.

    Na przykład, następujące wierzchołki aktualizuje nazwę shift, ale określa dodatkowe kolumny (StartTime, Czas_zakończenia) w <before> blok, w tym samym żądanie wyższy poziom ochrony przed współbieżnych aktualizacji.

    <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>
    

    W tym przykładzie określa najwyższy poziom ochrony, określając wszystkie wartości kolumna dla rekordu w <before> blok.

  • Określ kolumna sygnatury czasowej (jeżeli dostępne) w <before> blok.

    Zamiast określania wszystkich kolumn rekordu w <before> blok, można po prostu określić kolumna sygnatury czasowej (Jeśli tabela ma jeden) wraz z klucz podstawowy kolumn w <before> blok.Baza danych aktualizuje kolumna sygnatury czasowej unikatową wartość po każdej aktualizacji rekordu.W takim przypadek wierzchołki porównuje wartość sygnatury czasowej z odpowiednią wartością w bazie danych.Wartość sygnatury czasowej, przechowywane w bazie danych jest wartość binarna.Dlatego kolumna sygnatury czasowej musi być określona w schemacie jako dt:type="bin.hex", dt:type="bin.base64", lub sql:datatype="timestamp".(You can specify either the xml data type or the Microsoft SQL Server data type.)

Aby przetestować wierzchołki

  1. Tworzenie tabela w tempdb bazy danych:

    USE tempdb
    CREATE TABLE Customer (
                 CustomerID  varchar(5),
                 ContactName varchar(20),
                 LastUpdated timestamp)
    
  2. Dodaj ten rekord próbki:

    INSERT INTO Customer (CustomerID, ContactName) VALUES 
                         ('C1', 'Andrew Fuller')
    
  3. Skopiuj następujące schematu XSD i wkleić go do Notatnika.Zapisać go jako 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. Skopiuj poniższy kod wierzchołki do Notatnika i zapisz go jako ConcurrencySampleTemplate.xml w tym samym katalogu, w którym zapisano schemat utworzony w poprzednim kroku.(Należy zauważyć, wartość sygnatury czasowej poniżej LastUpdated będzie różnią się w tabela Nabywca przykład, więc skopiować rzeczywistą wartość dla LastUpdated z tabela i wkleić wierzchołki).

    <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. Tworzenie i używanie szablon wykonać skryptu testu 4.0 SQLXML (Sqlxml4test.vbs).

    Aby uzyskać więcej informacji, zobacz Przy użyciu ADO SQLXML wykonanie kwerendy 4.0.

Jest to równoważne schematu XDR:

<?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>