Bagikan melalui


Menangani Masalah Konkurensi Database di Updategrams (SQLXML 4.0)

Berlaku untuk: SQL ServerAzure SQL Database

Seperti mekanisme pembaruan database lainnya, updategram harus menangani pembaruan bersamaan untuk data di lingkungan multipengguna. Updategram menggunakan Kontrol Konkurensi Optimis, yang menggunakan perbandingan data bidang tertentu sebagai rekam jepret untuk memastikan bahwa data yang akan diperbarui belum diubah oleh aplikasi pengguna lain sejak dibaca dari database. Updategram menyertakan nilai rekam jepret ini di <blok sebelum> updategram. Sebelum memperbarui database, updategram memeriksa nilai yang ditentukan dalam <blok sebelum> terhadap nilai yang saat ini ada di database untuk memastikan bahwa pembaruan valid.

Kontrol Konkurensi Optimis menawarkan tiga tingkat perlindungan dalam updategram: rendah (tidak ada), menengah, dan tinggi. Anda dapat memutuskan tingkat perlindungan apa yang Anda butuhkan dengan menentukan updategram yang sesuai.

Tingkat Perlindungan Terendah

Tingkat ini adalah pembaruan buta, di mana pembaruan diproses tanpa merujuk ke pembaruan lain yang telah dibuat sejak database terakhir dibaca. Dalam kasus seperti itu, Anda hanya menentukan kolom kunci utama di blok sebelum> untuk mengidentifikasi rekaman, dan Anda menentukan informasi yang diperbarui di <blok setelah>.<

Misalnya, nomor telepon kontak baru dalam updategram berikut sudah benar, terlepas dari nomor telepon sebelumnya. Perhatikan bagaimana <blok sebelum> hanya menentukan kolom kunci utama (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>  

Tingkat Perlindungan Menengah

Dalam tingkat perlindungan ini, updategram membandingkan nilai data saat ini yang diperbarui dengan nilai di kolom database untuk memastikan bahwa nilai belum diubah oleh beberapa transaksi lain sejak rekaman dibaca oleh transaksi Anda.

Anda bisa mendapatkan tingkat perlindungan ini dengan menentukan kolom kunci utama dan kolom yang Anda perbarui di blok sebelumnya>.<

Misalnya, updategram ini mengubah nilai di kolom Telepon tabel Person.Contact untuk kontak dengan ContactID 1. Blok <sebelum> menentukan atribut Telepon untuk memastikan bahwa nilai atribut ini cocok dengan nilai di kolom terkait dalam database sebelum menerapkan nilai yang diperbarui.

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

Tingkat Perlindungan Tinggi

Tingkat perlindungan yang tinggi memastikan bahwa catatan tetap sama sejak aplikasi Anda terakhir membaca rekaman itu (yaitu, karena aplikasi Anda telah membaca rekaman, catatan tersebut belum diubah oleh transaksi lain).

Ada dua cara untuk mendapatkan perlindungan tingkat tinggi ini terhadap pembaruan bersamaan:

  • Tentukan kolom tambahan dalam tabel di blok sebelum>.<

    Jika Anda menentukan kolom tambahan di <blok sebelum> , updategram membandingkan nilai yang ditentukan untuk kolom ini dengan nilai yang ada di database sebelum menerapkan pembaruan. Jika salah satu kolom rekaman telah berubah sejak transaksi Anda membaca rekaman, updategram tidak melakukan pembaruan.

    Misalnya, updategram berikut memperbarui nama shift, tetapi menentukan kolom tambahan (StartTime,EndTime) di <blok sebelumnya> , sehingga meminta tingkat perlindungan yang lebih tinggi terhadap pembaruan bersamaan.

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

    Contoh ini menentukan tingkat perlindungan tertinggi dengan menentukan semua nilai kolom untuk rekaman di blok sebelumnya>.<

  • Tentukan kolom tanda waktu (jika tersedia) di blok sebelumnya>.<

    Alih-alih menentukan semua kolom rekaman di blok sebelum>, Anda cukup menentukan kolom tanda waktu (jika tabel memilikinya) bersama dengan kolom kunci utama di <blok sebelumnya>.< Database memperbarui kolom tanda waktu ke nilai unik setelah setiap pembaruan rekaman. Dalam hal ini, updategram membandingkan nilai tanda waktu dengan nilai yang sesuai dalam database. Nilai tanda waktu yang disimpan dalam database adalah nilai biner. Oleh karena itu, kolom tanda waktu harus ditentukan dalam skema sebagai dt:type="bin.hex", dt:type="bin.base64", atau sql:datatype="timestamp". (Anda dapat menentukan jenis data xml atau jenis data Microsoft SQL Server.)

Untuk menguji updategram

  1. Buat tabel ini di database tempdb :

    USE tempdb  
    CREATE TABLE Customer (  
                 CustomerID  varchar(5),  
                 ContactName varchar(20),  
                 LastUpdated timestamp)  
    
  2. Tambahkan rekaman sampel ini:

    INSERT INTO Customer (CustomerID, ContactName) VALUES   
                         ('C1', 'Andrew Fuller')  
    
  3. Salin skema XSD berikut dan tempelkan ke Notepad. Simpan sebagai 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. Salin kode updategram berikut ke Notepad dan simpan sebagai ConcurrencySampleTemplate.xml di direktori yang sama tempat Anda menyimpan skema yang dibuat di langkah sebelumnya. (Perhatikan nilai tanda waktu di bawah ini untuk LastUpdated akan berbeda dalam contoh tabel Pelanggan Anda, jadi salin nilai aktual untuk LastUpdated dari tabel dan tempelkan ke dalam 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. Buat dan gunakan Skrip Pengujian SQLXML 4.0 (Sqlxml4test.vbs) untuk menjalankan templat.

    Untuk informasi selengkapnya, lihat Menggunakan ADO untuk Menjalankan Kueri SQLXML 4.0.

Ini adalah skema XDR yang setara:

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

Lihat Juga

Pertimbangan Keamanan Updategram (SQLXML 4.0)