Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Van toepassing op:SQL Server
Azure SQL Database
Net als andere database-updatemechanismen moeten updategrammen omgaan met gelijktijdige updates van data in een multiuseromgeving. Updategrammen gebruiken de Optimistic Concurrency Control, waarbij geselecteerde veldgegevens als snapshots worden vergeleken om te verzekeren dat de te updaten data niet door een andere gebruikersapplicatie is aangepast sinds deze uit de database is gelezen. Updategrammen bevatten deze snapshotwaarden in het <voor-blok> van de updategrammen. Voordat de database wordt bijgewerkt, controleert het updategram de waarden die in het <voor-blok> zijn gespecificeerd met de waarden die momenteel in de database staan om te verzekeren dat de update geldig is.
De Optimistic Concurrency Control biedt drie beschermingsniveaus in een updategram: laag (geen), intermediair en hoog. Je kunt bepalen welk beschermingsniveau je nodig hebt door het updategram passend te specificeren.
Laagste beschermingsniveau
Dit niveau is een blinde update, waarbij de update wordt verwerkt zonder verwijzing naar andere updates die sinds de laatste lezing van de database zijn uitgevoerd. In zo'n geval specificeer je alleen de primaire sleutelkolom(men) in het <voor-blok> om het record te identificeren, en geef je de bijgewerkte informatie in het <na-blok> op.
Bijvoorbeeld, het nieuwe contacttelefoonnummer in het volgende updategram is correct, ongeacht wat het vorige telefoonnummer was. Let op hoe het <voor-blok> alleen de kolom primaire sleutel (ContactID) specificeert.
<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>
Tussenniveau van bescherming
In dit beschermingsniveau vergelijkt het updategram de huidige waarde (of de gegevens) van de te updaten met de waarde in de databasekolom(men) om te verzekeren dat de waarden niet door een andere transactie zijn gewijzigd sinds het record door jouw transactie is gelezen.
Je kunt dit beschermingsniveau krijgen door de primaire sleutelkolom(men) en de kolom(men) die je bijwerkt in het <voor-blok> te specificeren.
Bijvoorbeeld, dit updategram verandert de waarde in de kolom Telefoon van de Person.Contact-tabel voor het contact met ContactID van 1. Het <voor-blok> specificeert het Phone-attribuut om ervoor te zorgen dat deze attribuutwaarde overeenkomt met de waarde in de overeenkomstige kolom in de database voordat de bijgewerkte waarde wordt toegepast.
<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>
Hoog beschermingsniveau
Een hoog beschermingsniveau zorgt ervoor dat het record hetzelfde blijft sinds je aanvraag dat record voor het laatst heeft gelezen (dat wil zeggen, omdat je aanvraag het record heeft gelezen, is het niet gewijzigd door een andere transactie).
Er zijn twee manieren waarop je dit hoge beschermingsniveau kunt krijgen tegen gelijktijdige updates:
Specificeer extra kolommen in de tabel in het <voor-blok> .
Als je extra kolommen in het <voor-blok> specificeert, vergelijkt het updategram de waarden die voor deze kolommen zijn gespecificeerd met de waarden die in de database stonden voordat de update werd toegepast. Als een van de recordkolommen is veranderd sinds je transactie het record hebt gelezen, voert het updategram de update niet uit.
Bijvoorbeeld, het volgende updategram werkt de shiftnaam bij, maar specificeert extra kolommen (StartTime, EndTime) in het <voor-blok> , waardoor een hoger beschermingsniveau tegen gelijktijdige updates wordt aangevraagd.
<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>Dit voorbeeld specificeert het hoogste beschermingsniveau door alle kolomwaarden voor het record in het <voor-blok> te specificeren.
Geef de tijdstempelkolom (indien beschikbaar) in het <voor-blok> op.
In plaats van alle recordkolommen in het <voor-blok> te specificeren, kun je gewoon de tijdstempelkolom (als de tabel die heeft) samen met de primaire sleutelkolom(men) in het <voor-blok> specificeren. De database werkt de tijdstempelkolom bij naar een unieke waarde na elke update van het record. In dit geval vergelijkt het updategram de waarde van de tijdstempel met de overeenkomstige waarde in de database. De tijdstempelwaarde die in de database wordt opgeslagen is een binaire waarde. Daarom moet de tijdstempelkolom in het schema worden gespecificeerd als dt:type="bin.hex", dt:type="bin.base64", of sql:datatype="timestamp". (Je kunt zowel het xml-datatype als het Microsoft SQL Server-datatype specificeren.)
Om het updategram te testen
Maak deze tabel aan in de tempdb-database :
USE tempdb CREATE TABLE Customer ( CustomerID varchar(5), ContactName varchar(20), LastUpdated timestamp)Voeg dit voorbeeldalbum toe:
INSERT INTO Customer (CustomerID, ContactName) VALUES ('C1', 'Andrew Fuller')Kopieer het volgende XSD-schema en plak het in Notepad. Sla het op als 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>Kopieer de volgende updategram-code naar Notepad en sla deze op als ConcurrencySampleTemplate.xml in dezelfde map waar je het schema hebt opgeslagen dat in de vorige stap is gemaakt. (Let op: de tijdstempelwaarde hieronder voor LastUpdated zal verschillen in je voorbeeld-klanttabel, dus kopieer de daadwerkelijke waarde voor LastUpdated uit de tabel en plak deze in het 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>Maak het SQLXML 4.0 Test Script (Sqlxml4test.vbs) aan en gebruik het om het sjabloon uit te voeren.
Zie ADO gebruiken om SQLXML 4.0-query's uit te voeren voor meer informatie.
Dit is het equivalente 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>