Udostępnij przez


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

Podobnie jak inne mechanizmy aktualizacji bazy danych updategrams musi dotyczyć równoczesnych aktualizacji danych w środowisku wielodostępnym.Użycie Updategrams optymistycznego sterowania współbieżność używa porównanie wybierz pole danych migawek, aby zapewnić, że dane, które mają być aktualizowane nie została zmieniona przez inną aplikację użytkownika od czasu odczytu z bazy danych.Te wartości migawka obejmują Updategrams <before> Blok updategrams. Przed zaktualizowaniem bazy danych, the updategram sprawdza, czy wartości, które są określone w <before> blok z wartościami aktualnie jest prawidłowy w bazie danych, aby upewnić się, że aktualizacja.

Optymistycznego sterowania współbieżność oferuje trzy poziomy ochrony w updategram: niska (brak), pośrednich i wysoki. Użytkownik może zdecydować, jaki poziom ochrony należy odpowiednio określając updategram.

Najniższy poziom ochrony

Na tym poziomie jest ukryte aktualizacja, przetwarzanie aktualizacji bez odwołania do innych aktualizacji, które zostały zmienione od czasu ostatniego odczytu bazy danych.W takim przypadek można określić tylko klucz podstawowy kolumna w <before> blokowanie do identyfikowania rekordu i podaj aktualne informacje w <after> blok.

Na przykład nowy numer telefonu kontaktu, w następujących updategram jest poprawna, niezależnie od tego jaki numer telefonu była wcześniej.Ogłoszenie w jaki sposób <before> Blok określa tylko klucz kolumna podstawowej (ContactID).

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

Pośredni poziom ochrony

W tym poziom ochrony updategram porównuje bieżące wartości danych, aktualizowany o wartości kolumna bazy danych, aby zapewnić, że wartości nie zostały zmienione przez niektóre inne transakcji, ponieważ rekord została przeczytana przez transakcję.

Ten poziom ochrony można uzyskać przez określenie kolumna klucz podstawowy i kolumn, który jest aktualizowany w <before> blok.

Na przykład ten updategram zmienia wartość kolumna telefonu Person.Contact w tabela Kontakt z ContactID 1.The <before> blok specifies the Phone atrybut to ensure that this atrybut value matches the value in the corresponding kolumna in the database before applying the updated value.

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

Wysoki poziom ochrony

Wysoki poziom ochrony zapewnia, że rekord pozostaje bez zmian ponieważ aplikacja ostatniego odczytu tego rekordu (oznacza to, ponieważ aplikacja ma odczytu rekordu, to nie zostanie zmienione przez inne transakcje).

Istnieją dwa sposoby, można uzyskać ten wysoki poziom ochrony przed równoczesnych aktualizacji:

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

    Jeśli określisz dodatkowe kolumny w <before> blok, the updategram porównuje wartości określone dla tych kolumn z wartościami, które znajdowały się w bazie danych przed zastosowaniem tej aktualizacji. Jeśli żadna z kolumn rekord został zmieniony od czasu transakcji odczytu rekordu, the updategram nie wykonuje aktualizacji.

    Na przykład, następujące updategram aktualizuje zmiany nazwy, ale określa dodatkowe kolumny (StartTime, EndTime) w <before> blok, w związku z tym żądaniem wyższy poziom ochrony przed równoczesnych 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 poniższym 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śli dostępne) w <before> blok.

    Zamiast określać kolumna rekordu w <before> blokowanie, można po prostu określić kolumna sygnatury czasowej (jeżeli w tabela istnieje) wraz z kolumna klucz podstawowy w <before> blok. Baza danych aktualizuje kolumna sygnatury czasowej unikatową wartość po każdej aktualizacji rekordu.W takim przypadek updategram 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ć updategram

  1. Tworzenie tabela w tempdb bazy danych:

    USE tempdb
    CREATE TABLE Customer (
                 CustomerID  varchar(5),
                 ContactName varchar(20),
                 LastUpdated timestamp)
    
  2. Dodaj ten rekord przykładowe:

    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 następujący kod updategram w Notatniku 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ładzie, więc skopiować wartość rzeczywista dla LastUpdated z tabela i wklej go do updategram).

    <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 skryptu testu 4.0 SQLXML (Sqlxml4test.vbs) do wykonać tego szablonu.

    Aby uzyskać więcej informacji zobaczPrzy użyciu obiektu ADO do wykonywania SQLXML bada 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>