Aracılığıyla paylaş


Updategrams (sqlxml 4.0) veritabanı eşzamanlılık sorunlarını işleme

Diğer veritabanı güncelleştirme mekanizmaları gibi çok kullanıcılı bir ortamda verileri eşzamanlı güncelleştirmeleri updategrams uğraşmak gerekir. Updategrams kullanma karşılaştırmasını kullanır iyimser eşzamanlılık denetimi veritabanından okunduğundan bu yana güncelleştirilecek veri başka bir kullanıcı uygulamayla değiştirilmiştir değil ki emin olmak için anlık olarak alan verileri seçin. Updategrams dahil bu anlık değerler <before>Blok updategrams. Updategram içinde belirtilen değerleri denetler veritabanını güncelleştirmeden önce <before>Blok karşı şu anda güncelleştirme geçerli olduğundan emin olmak için veritabanı değerleri.

İyimser eşzamanlılık denetimi üç düzeyde bir updategram koruma sunar: düşük (yok), Orta ve yüksek. Updategram buna göre belirleyerek gereken koruma düzeyini seçebilirsiniz.

En düşük düzeyde koruma

Bu düzey, güncelleştirme olmadan başvuru veritabanı son okunduğundan bu yana yapılan güncelleştirmeler işlenir kör bir güncelleştirmedir. Böyle bir durumda, yalnızca birincil anahtar sütunları olarak belirttiğiniz <before>kaydı tanımlamak için engellemek ve güncelleştirilmiş bilgileri belirtmeniz <after>Blok.

Örneğin, yeni ilgili kişi telefon numarasını aşağıdaki updategram doğru ne bir telefon numarası ne olursa olsun daha önce oldu. Fark nasıl <before>Blok belirtir yalnızca birincil anahtar sütunu (ilgili kişi kimliği).

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

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

Orta düzeyde koruma

Bu düzeyinde koruma, geçerli değerler ile değerler olarak kayıt işleminiz tarafından okunduğundan bu yana değerleri başka bir işlem tarafından değiştirilmiş değil ki emin olmak için veritabanı sütunları güncelleştirilen veri için updategram karşılaştırır.

Sen-ebilmek almak bu düzeyde koruma olarak güncelleştirdiğiniz sütunları birincil anahtar sütunları belirterek <before>Blok.

Örneğin, Bu updategram Person.Contact tablo ContactID 1 kişiyle telefon sütunundaki değeri değişir. <before>Blok belirtir Telefon özniteliği güncelleştirilmiş değeri uygulamadan önce bu öznitelik değeri veritabanındaki karşılık gelen sütun değerini eşleştiğinden emin olun.

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

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

Yüksek koruma düzeyi

Yüksek düzeyde bir koruma uygulama son kaydı okumak beri kaydı aynı kalmasını sağlar (uygulamanızın kayıt okuma beri yani o başka bir işlem tarafından değiştirildi değil).

Sen-ebilmek almak bu yüksek karşı koruma düzeyi eşzamanlı güncelleştirmeleri iki yolu vardır:

  • Tablo içinde ek sütunları belirtmek <before>Blok.

    Örneğin, ek sütunlar belirtirseniz <before> blok, the updategram bu sütunların değerleri içeren veritabanını güncelleştirmeyi uygulamadan önce vardı belirtilen değerleri karşılaştırır. Herhangi bir kayıt sütunda değişti, işlem kaydı okumak beri updategram güncelleştirme gerçekleştirmez.

    Örneğin, aşağıdaki updategram vardiya adı güncelleştirir, ancak ek sütunlar (StartTime, BitişZamanı) belirtir <before>blok, böylece eşzamanlı güncelleştirmeleri karşı koruma düzeyi daha yüksek isteniyor.

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

    Bu örnek, tüm sütun değerleri içinde kayıt belirterek koruma düzeyini belirtir <before>Blok.

  • Zaman damgası sütun (varsa) belirtmek <before>Blok.

    Kayıt tüm sütunları belirtmek yerine <before>blok, (tablo varsa) sadece zaman damgası sütun birincil anahtar sütunu/sütunları içinde birlikte belirleyebileceğiniz <before>Blok. Veritabanı zaman damgası sütun için benzersiz bir değer her kaydın güncelleştirmeden sonra güncelleştirir. Bu durumda, the updategram zaman damgası değeri veritabanındaki karşılık gelen değerle karşılaştırır. Veritabanında depolanan zaman damgası değeri ikili bir değerdir. Bu nedenle, zaman damgası sütun şeması olarak belirtilmelidir dt:type="bin.hex", dt:type="bin.base64", ya sql:datatype="timestamp". (Ya da belirtebilirsiniz xmlveri türü veya Microsoft  SQL Serververi türü.)

Updategram sınamak için

  1. Bu tablo oluşturmak tempdb veritabanı:

    USE tempdb
    CREATE TABLE Customer (
                 CustomerID  varchar(5),
                 ContactName varchar(20),
                 LastUpdated timestamp)
    
    USE tempdb
    CREATE TABLE Customer (
                 CustomerID  varchar(5),
                 ContactName varchar(20),
                 LastUpdated timestamp)
    
  2. Bu örnek kaydı ekleyin:

    INSERT INTO Customer (CustomerID, ContactName) VALUES 
                         ('C1', 'Andrew Fuller')
    
    INSERT INTO Customer (CustomerID, ContactName) VALUES 
                         ('C1', 'Andrew Fuller')
    
  3. Aşağıdaki xsd şeması kopyalayıp Not Defteri'ne yapıştırın. Dosyayı ConcurrencySampleSchema.xml kaydedin:

    <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>
    
    <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. Aşağıdaki updategram kodu Not Defteri'ne kopyalayın ve ConcurrencySampleTemplate.xml önceki adımda oluşturduğunuz şema kaydettiğiniz aynı dizine kaydedin. (LastUpdated timestamp değerini aşağıda örnek müşteri tablonuzda farklı, yani gerçek değeri için LastUpdated tablodan kopyalama ve updategram yapıştırmak unutmayın.)

    <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>
    
    <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. Oluşturun ve sqlxml 4.0 sınama komut dosyası (Sqlxml4test.vbs) şablonu yürütmek için kullanın.

    Daha fazla bilgi için, bkz. ado sqlxml yürütme kullanarak 4.0 sorgular.

Eşdeğer xdr şeması budur:

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

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

Ayrıca bkz.

Başvuru

Updategram Güvenlik etkenleri (sqlxml 4.0)