logo

SQL serverio operacija

SQL serverio operacija yra a nuosekli teiginių ar užklausų grupė atlikti vieną ar kelias užduotis duomenų bazėje. Kiekviena operacija gali turėti vieną skaitymo, rašymo, atnaujinimo ar ištrynimo operaciją arba visų šių operacijų derinį. Kiekviena operacija SQL serveryje turi įvykti dviem dalykais:

  • Visi pakeitimai yra sėkmingi, kai operacija yra įvykdyta.
  • Arba visi pakeitimai anuliuojami, kai operacija atšaukiama.

Sandoris negali būti sėkmingas, kol nebus užbaigtos visos rinkinio operacijos. Tai reiškia, kad jei kuris nors argumentas nepavyks, operacijos operacija nepavyks. Kiekviena operacija prasideda pirmuoju vykdomuoju SQL sakiniu ir baigiasi, kai randamas tiesioginis arba netiesioginis įsipareigojimas arba atšaukimas. Jis naudoja ĮSIPAREIGOTI arba ATGALIMAS teiginius tiesiogiai, taip pat netiesiogiai, kai naudojamas DDL teiginys.

Toliau pateiktame paveikslėlyje paaiškinamas operacijos procesas:

SQL serverio operacija

Šis pavyzdys paaiškins sandorio sąvoką:

eilutė iki sveikojo skaičiaus

Šiame pavyzdyje operacijos sąvokai paaiškinti bus naudojama banko duomenų bazių sistema. Tarkime, banko klientas nori pasiimti pinigus iš savo sąskaitos, naudodamas bankomato režimą. Bankomatas gali atlikti šią operaciją trimis etapais:

  1. The Pirmas žingsnis yra patikrinti, ar sąskaitoje yra prašomos sumos.
  2. The antrasis žingsnis nuskaito sumą iš sąskaitos, jei suma yra prieinama, ir tada atnaujina sąskaitos likutį.
  3. The trečias žingsnis yra įrašyti pinigų išėmimo operaciją žurnalo faile. Šis veiksmas rašo, kad sandoris buvo sėkmingas arba nesėkmingas. Jei pavyks, duomenų modifikaciją įrašykite į duomenų bazę. Priešingu atveju operacija bus grąžinta į ankstesnę būseną.

Pagrindinis operacijų principas yra tas, kad jei vienas iš teiginių pateikia klaidą, visas pakeitimų rinkinys atšaukiamas, kad būtų užtikrintas duomenų vientisumas. Ir jei operacijos bus sėkmingos, visi pakeitimai bus nuolatiniai duomenų bazėje. Taigi, jei nutrūktų elektra ar atsiras kitų problemų išimant pinigus iš bankomato, operacijos garantuoja, kad mūsų likutis išliks pastovus. Operacijos ataskaita geriausiai atlieka šias operacijas, nes dėl keturių pagrindinių operacijos savybių visos operacijos tampa tikslesnės ir nuoseklesnės. Keturios sandorio savybės vadinamos ACID.

Sandorio ypatybės

Sandorio savybės yra vadinamos ACID (atomiškumas, nuoseklumas, izoliacija, ilgaamžiškumas) savybė, kuri išsamiai aptariama toliau:

SQL serverio operacija

Atomiškumas: Ši savybė užtikrina, kad visi į operaciją įtraukti teiginiai ar operacijos turi būti sėkmingai atlikti. Priešingu atveju visa operacija bus nutraukta, o visos operacijos grąžinamos į ankstesnę būseną, kai kuri nors operacija nepavyksta.

Nuoseklumas: Ši ypatybė užtikrina, kad duomenų bazės būsena pakeistų tik tada, kai operacija bus sėkmingai atlikta. Ji taip pat atsakinga už duomenų apsaugą nuo gedimų.

Isolation: Ši nuosavybė garantuoja, kad visos operacijos yra atskirtos nuo kitų operacijų, o tai reiškia, kad kiekviena operacijos operacija atliekama atskirai. Taip pat užtikrinama, kad pareiškimai būtų skaidrūs vienas kitam.

Patvarumas: Ši savybė garantuoja, kad įvykdytų operacijų rezultatas išliks duomenų bazėje visam laikui, net jei sistema sugenda arba sugenda.

SQL serverio operacijų režimai

Yra trys skirtingi operacijų režimai, kuriuos gali naudoti SQL serveris:

Automatinio patvirtinimo operacijos režimas: Tai numatytasis SQL serverio operacijų režimas. Jis įvertins kiekvieną SQL teiginį kaip operaciją, o rezultatai atitinkamai priskiriami arba atšaukiami. Taigi sėkmingi pareiškimai iš karto padaromi, o nesėkmingi pareiškimai nedelsiant atšaukiami.

Netiesioginio sandorio režimas. Šis režimas leidžia SQL serveriui pradėti netiesioginę kiekvieno DML sakinio operaciją, tačiau teiginių pabaigoje aiškiai reikalaujama naudoti commit arba rollback komandas.

Aiškios operacijos režimas: Šį režimą apibrėžia vartotojas, kuris leidžia tiksliai nustatyti operacijos pradžios ir pabaigos taškus. Įvykus lemtingai klaidai, jis automatiškai nutrūks.

Sandorių kontrolė

Toliau pateikiamos operacijos, naudojamos valdyti operacijas:

    PRADĖTI SANDORIĄ:Tai komanda, nurodanti kiekvienos operacijos pradžią.ĮSIPAREIGOTI:Tai komanda, naudojama visam laikui išsaugoti pakeitimus duomenų bazėje.ATGALIMAS:Tai komanda, naudojama atšaukti visus pakeitimus ir pereiti į ankstesnę būseną.SAVEPOINT:Ši komanda sukuria taškus operacijų grupėse, leidžiančias atšaukti tik dalį operacijos, o ne visą operaciją.IŠSAUGOJIMO TAŠKĄ:Jis naudojamas pašalinti jau esamą SAVEPOINT.NUSTATYTI SANDORIUS:Ši komanda suteikia operacijai pavadinimą, kurį galima naudoti, kad ji būtų tik skaitymo, skaitymo / rašymo arba priskirta konkrečiam atšaukimo segmentui.

PASTABA: Operacijų valdymo kalbos komandoms galime naudoti tik DML teiginius (INSERT, UPDATE ir DELETE). Negalime jų naudoti kurdami arba išmesdami lenteles, nes šios operacijos yra automatiškai įtraukiamos į duomenų bazę.

Sandorio būsena

Tai rodo, kaip operacijos vyksta per jų gyvavimo laikotarpį. Jame aprašoma dabartinė operacijos būsena ir tai, kaip operacija bus apdorojama ateityje. Šios būsenos apibrėžia taisykles, pagal kurias nustatoma, ar sandoris bus įvykdytas, ar nutraukiamas.

SQL serverio operacija

Apibūdinkime kiekvieną operacijų būseną SQL serveryje:

Aktyvi būsena: Kol vykdomi operacijos nurodymai, operacija yra aktyvios būsenos. Jis keičiasi į „iš dalies įsipareigojusi būsena“ jei visos „skaitymo ir rašymo“ operacijos atliekamos be klaidų. Jei kuri nors instrukcija nepavyksta, ji pakeičiama į „nepavyko būseną“.

Iš dalies įsipareigojęs: Kai baigiamos visos skaitymo ir rašymo operacijos, pakeičiama pagrindinė atmintis arba vietinis buferis. Valstybė eitų į „įsipareigojusi būsena“ jei pakeitimai yra nuolatiniai duomenų bazėje. Priešingu atveju ji pereina į „nesėkmę“.

Nepavyko būsena: Operacija pereina į nepavykusią būseną, kai nepavyksta įvykdyti bet kurios operacijos instrukcijos arba nepavyksta atlikti nuolatinio duomenų bazės pakeitimo.

Nutraukta valstybė: Sandoris perkeliamas iš a „nepavykusi būsena“ į an „nutraukta būsena“ kai įvyksta koks nors gedimas. Pakeitimai pašalinami arba atšaukiami, nes šie pakeitimai atliekami tik vietiniame buferyje arba pagrindinėje atmintyje ankstesnėse būsenose.

Įsipareigojusi būsena: Operacija baigta ir pereina į šią būseną, kai pakeitimai padaromi nuolatiniais duomenų bazėje ir nutraukiami „nutraukta būsena“.

Nutraukta būsena: Jei nėra grąžinimo ir sandoris yra „įsipareigojusi būsena“, sistema yra nuosekli ir paruošta naujam sandoriui, o senoji nutraukiama.

Transakcijos įgyvendinimas SQL serveryje

Paimkime keletą pavyzdžių, kad suprastume, kaip galime įgyvendinti operaciją SQL Server. Čia mes naudosime 'Produktas' lentelė, kurioje parodytos visos operacijos būsenos.

Šie SQL scenarijai sukuria produktų lentelę pasirinktoje duomenų bazėje:

 CREATE TABLE Product ( Product_id INT PRIMARY KEY, Product_name VARCHAR(40), Price INT, Quantity INT ) 

Tada paleiskite toliau pateiktus scenarijus, kad įterptumėte duomenis į šią lentelę:

 INSERT INTO Product VALUES(111, 'Mobile', 10000, 10), (112, 'Laptop', 20000, 15), (113, 'Mouse', 300, 20), (114, 'Hard Disk', 4000, 25), (115, 'Speaker', 3000, 20); 

Vykdykite SELECT sakinį, kad patikrintumėte duomenis:

SQL serverio operacija

COMMIT operacijos pavyzdys

Verta padalyti operacijoje naudojamus SQL teiginius į kelias logines dalis. Tada galime nuspręsti, ar įsipareigoti, ar grąžinti duomenis. Šie veiksmai iliustruoja, kaip sukurti operaciją:

  • Pradėkite operaciją naudodami PRADĖKITE SANDORIĄ komandą.
  • Parašykite SQL teiginius ir suskirstykite juos pagal mūsų poreikius
  • Naudoti ĮSIPAREIGOTI pareiškimą, kad užbaigtumėte operaciją ir visam laikui išsaugotumėte pakeitimus.

Žemiau yra komandos, paaiškinančios COMMIT operacijas SQL Server:

 -- Start a new transaction BEGIN TRANSACTION -- SQL Statements INSERT INTO Product VALUES(116, 'Headphone', 2000, 30) UPDATE Product SET Price = 450 WHERE Product_id = 113 -- Commit changes COMMIT TRANSACTION 

Jei klaida nerasta, pamatysime šią išvestį, kurioje kiekvienas operacijos SQL sakinys vykdomas atskirai:

SQL serverio operacija

Po operacijos INSERT ir UPDATE teiginių negalima atšaukti. Kai patikrinsime lentelę po įvykdymo operacijos, pamatysime šiuos duomenis:

SQL serverio operacija

ROLLBACK operacijos pavyzdys

Naudosime komandą ROLLBACK, kad atšauktume visas operacijas, kurios dar nebuvo išsaugotos duomenų bazėje, ir grįšime į tašką, kur prasidėjo operacija. Šis pavyzdys paaiškina ROLLBACK operaciją SQL serveryje:

 -- Start a new transaction BEGIN TRANSACTION -- SQL Statements UPDATE Product SET Price = 5000 WHERE Product_id = 114 DELETE FROM Product WHERE Product_id = 116 

Kai atliksime aukščiau nurodytą operaciją, pamatysime, kad ji bus sėkmingai įvykdyta. Tačiau tai neturės įtakos jokiems duomenų bazės pakeitimams, nes kol nevykdysime COMMIT arba ROLLBACK sakinio, pakeitimai negali tapti nuolatiniais. Todėl turime galimybę naudoti operacijų komandą ROLLBACK, kad atšauktume visas duomenų bazės operacijas. Čia yra visa sandorio ataskaita:

 -- Start a new transaction BEGIN TRANSACTION -- SQL Statements UPDATE Product SET Price = 5000 WHERE Product_id = 114 DELETE FROM Product WHERE Product_id = 116 --Undo Changes ROLLBACK TRANSACTION 

@@Error Global kintamojo naudojimas operacijose:

Šis kintamasis yra naudojamas patikrinti, ar yra klaida, ar ne. Žemiau pateiktame pavyzdyje paaiškinama jo koncepcija. Čia pirmiausia pradėsime operaciją naudodami komandą BEGIN ir tada parašysime du įterpimo teiginius. Toliau naudosime visuotinį sistemos kintamąjį @@KLAIDA viduje IF teiginys patikrinti klaidą. Jei reikšmė didesnė nei 0, tai reiškia, kad yra klaida. Dabar sandoris atšaukiamas; priešingu atveju sandoris yra įvykdytas.

 BEGIN TRANSACTION INSERT INTO Product VALUES(115,'Speaker', 3000, 25) -- Check for error IF(@@ERROR > 0) BEGIN ROLLBACK TRANSACTION END ELSE BEGIN COMMIT TRANSACTION END 

Kai aukščiau nurodyta operacija bus įvykdyta, pastebėsime, kad ji buvo atšaukta. Taip yra dėl mūsų bandymo įterpti pasikartojančią reikšmę stulpelyje Pagrindinis raktas.

Automatinis grąžinimo sandoris

Daugumoje operacijų yra daugiau nei viena užklausa. Vykdant operaciją, jei kuris nors iš SQL sakinių sukelia klaidą, duomenų bazėje nevyksta jokie pakeitimai, o likę teiginiai nevykdomi. Ši koncepcija SQL serveryje žinoma kaip automatinio grąžinimo operacija. Norėdami parodyti šį procesą, naudokite paprastą pavyzdį.

 BEGIN TRANSACTION INSERT INTO Product VALUES(118, 'Desktop', 25000, 15) UPDATE Product SET Quantity = 'ten' WHERE Product_id = 113 SELECT * FROM Product COMMIT TRANSACTION 

Ši operacija sukuria tokią išvestį:

SQL serverio operacija

Šiame išvestyje matome, kad įterpimo sakinys buvo sėkmingai įvykdytas. Tačiau vykdant atnaujinimo teiginį rasta klaida dėl duomenų tipo konvertavimo problemos. Šiuo atveju SQL serveris neleidžia atlikti jokių duomenų bazės pakeitimų, o tai reiškia, kad įterpimo operacija neprideda jokios vertės, o pasirinkimo sakinys nevykdomas.

„Savepoint“ operacijose

Įrašymo taškas įterpia specialų ženklą į operaciją, leidžiančią atšaukti visus pakeitimus, atliktus po išsaugojimo taško. Jis taip pat naudojamas bet kuriai konkrečiai operacijos daliai, o ne visai operacijai atšaukti. Jį galime apibrėžti naudodami IŠSAUGOTI OPERACIJĄ sp_pavadinimas pareiškimas. Toliau pateiktame pavyzdyje bus paaiškintas išsaugojimo taško naudojimas operacijose, kurios įpareigoja įterpti sakinį ir atšaukia trynimo sakinį.

 BEGIN TRANSACTION INSERT INTO Product VALUES(117, 'USB Drive', 1500, 10) SAVE TRANSACTION InsertStatement DELETE FROM Product WHERE Product_id = 116 SELECT * FROM Product ROLLBACK TRANSACTION InsertStatement COMMIT SELECT * FROM Product; 

Žiūrėkite žemiau esantį rezultatą, kuriame matome, kad produkto ID 116 ištrintas, o 117 įterptas į pirmąją išvestį. Tačiau antrajame išvestyje ištrynimo operacija atšaukiama dėl išsaugojimo taško.

SQL serverio operacija

Kaip atleisti išsaugojimo tašką sandoryje?

Išleidimo taškas naudojamas pavadintam išsaugojimo taškui pašalinti iš dabartinės operacijos negrąžinant užklausų, atliktų po išsaugojimo taško, rezultatų. „MySQL“ turi šią komandą, tačiau „SQL Server“ nepateikia jokios komandos išsaugoti tašką. Vietoj to, jie automatiškai išleidžiami pasibaigus įsipareigojimo arba atšaukimo operacijai, todėl mes neturime dėl jų jaudintis.

Netiesioginė operacija SQL serveryje

Netiesioginę operaciją galime apibrėžti įjungę parinktį IMPLICIT_TRANSACTIONS. Šis pavyzdys lengvai paaiškins šią sąvoką:

 SET IMPLICIT_TRANSACTIONS ON UPDATE Product SET Quantity = 10 WHERE Product_id = 113 SELECT IIF(@@OPTIONS & 2 = 2, 'Implicit Transaction Mode ON', 'Implicit Transaction Mode OFF' ) AS 'Transaction Mode' SELECT @@TRANCOUNT AS OpenTrans COMMIT TRANSACTION SELECT @@TRANCOUNT AS OpenTrans 

Šiame sandoryje mes naudojome dvi galimybes @@OPTION ir @@TRANCOUNT. @@OPTOPN pateikia informaciją apie dabartines SET parinktis, o @@TRANCOUNT pateikia teiginį BEGIN TRANSACTION dabartinėje sesijoje.

Dabar, vykdant operaciją, bus pateikta žemiau pateikta išvestis:

SQL serverio operacija

Aiški operacija SQL serveryje

Aiški operacija turi būti apibrėžta naudojant komandą BEGIN TRANSACTION, nes ji identifikuoja aiškios operacijos pradžios tašką. Aiškią operaciją SQL serveryje galime apibrėžti taip:

 BEGIN TRANSACTION [ @trans_name_variable [WITH MARK ['description']]] 

Sintaksėje trans_name parinktis nurodo unikalų operacijos pavadinimą. The @trans_name_var nurodo vartotojo nustatytą kintamąjį, kuriame saugomas operacijos pavadinimas. Galiausiai, ŽENKLAS parinktis leidžia žurnalo faile pažymėti konkrečią operaciją.

Aiški operacija per komandą BEGIN TRANSACTION buvo užrakinta, atsižvelgiant į su operacija susijusių išteklių izoliacijos lygį. Tai padeda sumažinti užrakinimo problemas. Žiūrėkite toliau pateiktą pavyzdį:

 BEGIN TRANSACTION UPDATE Product SET Quantity = 15 WHERE Product_id = 114 SELECT @@TRANCOUNT AS OpenTrans COMMIT TRANSACTION SELECT @@TRANCOUNT AS OpenTrans 

Štai išvestis:

SQL serverio operacija

Pažymėta operacija SQL serveryje

Pažymėta operacija naudojama norint pridėti konkrečios operacijos aprašymą žurnalo failuose. Galime naudoti jį kaip atkūrimo tašką vietoje datos ir laiko, kai atkuriame duomenų bazę į ankstesnę būseną. Turime žinoti, kad žyma įrašoma į žurnalo failus tik tada, kai pažymėta operacija pakeičia duomenų bazę. Jo koncepciją galime suprasti naudodami šį pavyzdį.

Tarkime, kad netyčia pakeitėme duomenų bazę ir nežinome tikslaus duomenų pakeitimo momento; tokiu atveju duomenų atkūrimas gali užtrukti ilgai. Tačiau jei naudosime pažymėtas operacijas, tai gali būti naudinga priemonė nustatant tikslų duomenų pakeitimų laiką.

Ši sintaksė iliustruoja pažymėtą operaciją SQL serveryje:

 BEGIN TRANSACTION trans_name WITH MARK 'description'; 

Čia turime apibrėžti operacijos pavadinimą ir pridėti WITH MARK parinktį. Toliau pateiktame pavyzdyje ketiname ištrinti įrašus ir pridėti ženklą žurnalo faile:

 BEGIN TRANSACTION DeleteProduct WITH MARK 'Deleted Product with id = 117' DELETE Product WHERE Product_id = 117 COMMIT TRANSACTION DeleteProduct 

The logmarkisto istorija lentelė įtraukta į msdb duomenų bazė ir saugo informaciją apie kiekvieną pažymėtą įvykdytą operaciją. Vykdykite toliau pateiktą teiginį, kad gautumėte išsamią informaciją iš logmarkhistory lentelės:

 SELECT * FROM msdb.dbo.logmarkhistory 

Pavadinta operacija SQL serveryje

Taip pat galime nurodyti savo operacijos pavadinimą SQL serveryje. Dirbant su daugybe operacijų vienoje užklausoje, visada rekomenduojama naudoti pavadintą operaciją. Toliau pateiktame pavyzdyje paaiškinama, kaip pervardyti operaciją:

 BEGIN TRANSACTION AddProduct INSERT INTO Product VALUES(118, 'Desktop', 25000, 15) UPDATE Product SET Product_name = 'Pen Drive' WHERE Product_id = 117 COMMIT TRANSACTION AddProduct 

Štai išvestis:

SQL serverio operacija

Išvada

Šiame straipsnyje bus pateikta išsami operacijos SQL serverio teiginiuose apžvalga. Sandoriai yra naudingi reliacinėse duomenų bazių sistemose, nes užtikrina duomenų bazės vientisumą.