logo

SQL servera darījums

Darījums SQL Server ir a secīga paziņojumu vai vaicājumu grupa veikt vienu vai vairākus uzdevumus datu bāzē. Katram darījumam var būt atsevišķas lasīšanas, rakstīšanas, atjaunināšanas vai dzēšanas darbības vai visu šo darbību kombinācija. Katrai transakcijai SQL Server ir jānotiek divām lietām:

  • Vai nu visas modifikācijas ir veiksmīgas, kad darījums ir veikts.
  • Vai arī visas izmaiņas tiek atsauktas, kad darījums tiek atcelts.

Darījums nevar būt veiksmīgs, kamēr nav pabeigtas visas komplektā esošās darbības. Tas nozīmē, ka, ja kāds arguments neizdodas, darījuma darbība neizdosies. Katra transakcija sākas ar pirmo izpildāmo SQL priekšrakstu un beidzas, kad tā tieši vai netieši konstatē apņemšanos vai atcelšanu. Tas izmanto APŅEMT vai ATGRIEŠANA paziņojumus tieši, kā arī netieši, ja tiek izmantots DDL paziņojums.

Tālāk redzamajā attēla attēlā ir izskaidrots darījuma process:

SQL servera darījums

Šis piemērs izskaidro darījuma jēdzienu:

Šajā piemērā tiks izmantota banku datu bāzes sistēma, lai izskaidrotu darījuma jēdzienu. Pieņemsim, ka bankas klients vēlas izņemt naudu no sava konta, izmantojot bankomāta režīmu. Bankomāts var veikt šo darbību trīs soļos:

  1. The pirmais solis ir pārbaudīt pieprasītās summas pieejamību kontā.
  2. The otrais solis ietur summu no konta, ja summa ir pieejama, un pēc tam atjaunina konta atlikumu.
  3. The trešais solis ir ierakstīt naudas izņemšanas operāciju žurnālfailā. Šis solis norāda, ka darījums ir veiksmīgs vai neizdevies. Ja izdodas, ierakstiet datu modifikāciju datu bāzē. Pretējā gadījumā darījums tiks atgriezts iepriekšējā stāvoklī.

Darījumu pamatprincips ir tāds, ka, ja kāds no paziņojumiem atgriež kļūdu, visa izmaiņu kopa tiek atsaukta, lai nodrošinātu datu integritāti. Un, ja darījumi būs veiksmīgi, visas izmaiņas būs pastāvīgas datu bāzē. Tādējādi, ja, izņemot naudu no bankomāta, rodas strāvas padeves pārtraukums vai citas problēmas, darījumi garantē mūsu bilances konsekvenci. Darījuma paziņojums vislabāk veic šīs darbības, jo darījuma četri galvenie rekvizīti padara visas darbības precīzākas un konsekventākas. Darījuma četri īpašumi tiek saukti par ACID.

Darījuma īpašības

Darījuma īpašības tiek sauktas par ACID (atomiskums, konsistence, izolācija, izturība) īpašību, kas ir detalizēti apspriesta tālāk:

SQL servera darījums

Atomiskums: Šis rekvizīts nodrošina, ka visi darījumā iekļautie paziņojumi vai darbības ir jāveic veiksmīgi. Pretējā gadījumā viss darījums tiks pārtraukts, un visas darbības tiek atgrieztas iepriekšējā stāvoklī, ja kāda darbība neizdodas.

Konsekvence: Šis rekvizīts nodrošina, ka datubāze maina statusu tikai tad, kad transakcija tiks veiksmīgi veikta. Tas ir arī atbildīgs par datu aizsardzību pret avārijām.

Izolācija: Šis īpašums garantē, ka visi darījumi ir izolēti no citiem darījumiem, kas nozīmē, ka katra darījuma darbība tiek veikta neatkarīgi. Tas arī nodrošina, ka paziņojumi ir pārskatāmi viens otram.

Izturība: Šis rekvizīts garantē, ka veikto darījumu rezultāts pastāvīgi saglabājas datu bāzē pat tad, ja sistēma avarē vai neizdodas.

Darījumu režīmi SQL serverī

Ir trīs dažādi darījumu režīmi, ko SQL Server var izmantot:

Automātiskās apņemšanās darījuma režīms: Tas ir SQL Server noklusējuma darījumu režīms. Tas novērtēs katru SQL priekšrakstu kā transakciju, un rezultāti tiek attiecīgi piesaistīti vai atsaukti. Tādējādi veiksmīgie paziņojumi tiek nekavējoties izdarīti, savukārt neveiksmīgie paziņojumi tiek nekavējoties atsaukti.

Netiešā darījuma režīms. Šis režīms ļauj SQL Server sākt netiešo transakciju katram DML priekšrakstam, taču priekšrakstu beigās ir skaidri jāizmanto commit vai rollback komandas.

Skaidra darījuma režīms: Šo režīmu nosaka lietotājs, kas ļauj precīzi noteikt darījuma sākuma un beigu punktus. Nāvējošas kļūdas gadījumā tas automātiski tiks pārtraukts.

Darījumu kontrole

Tālāk ir norādītas komandas, ko izmanto, lai kontrolētu darījumus.

    SĀKT DARĪJUMU:Tā ir komanda, kas norāda katra darījuma sākumu.APŅEMT:Tā ir komanda, ko izmanto, lai pastāvīgi saglabātu izmaiņas datu bāzē.ATPAKAĻ:Tā ir komanda, ko izmanto, lai atceltu visas modifikācijas un pārietu uz to iepriekšējo stāvokli.SAVEPOINT:Šī komanda izveido punktus darījumu grupās, kas ļauj mums atsaukt tikai daļu no darījuma, nevis visu darījumu.ATBRĪVOT SAVE PONT:To izmanto, lai noņemtu jau esošu SAVEPOINT.IESTATĪT DARĪJUMU:Šī komanda piešķir darījumam nosaukumu, ko var izmantot, lai padarītu to tikai lasāmu vai lasāmu/rakstāmu, vai piešķirtu to noteiktam atcelšanas segmentam.

PIEZĪME. Darījumu vadības valodas komandām varam izmantot tikai DML priekšrakstus (INSERT, UPDATE un DELETE). Mēs nevaram tos izmantot, veidojot vai nolaižot tabulas, jo šīs darbības tiek automātiski veiktas datu bāzē.

Darījuma stāvoklis

Tas norāda, kā darījumi notiek to dzīves laikā. Tas apraksta pašreizējo darījuma stāvokli, kā arī to, kā darījums tiks apstrādāts nākotnē. Šie stāvokļi nosaka noteikumus, kas nosaka, vai darījums tiek veikts vai pārtraukts.

SQL servera darījums

Aprakstīsim katru transakcijas stāvokli SQL Server:

Aktīvais stāvoklis: Darījums ir aktīvā stāvoklī, kamēr tiek izpildīti darījuma norādījumi. Tas mainās uz 'daļēji saistīta valsts' ja visas “lasīšanas un rakstīšanas” darbības tiek veiktas bez kļūdām. Ja kāda instrukcija neizdodas, tā tiek mainīta uz neizdevušos stāvokli.

rohit shetty aktieris

Daļēji apņēmusies: Kad visas lasīšanas un rakstīšanas darbības ir pabeigtas, izmaiņas tiek veiktas galvenajā atmiņā vai lokālajā buferī. Valsts dotos uz 'apņemšanās' ja izmaiņas datu bāzē ir padarītas pastāvīgas. Pretējā gadījumā tas pāriet uz 'neizdevušos stāvokli'.

Neizdevās stāvoklis: Darījums pāriet uz neizdevušos stāvokli, ja neizdodas izpildīt jebkuras transakcijas instrukcijas vai neizdodas veikt pastāvīgu datubāzes modifikāciju.

Pārtraukts valsts: Darījums pāriet no a 'neizdevies stāvoklis' uz an 'pārtraukts stāvoklis' kad notiek jebkāda veida kļūme. Izmaiņas tiek noņemtas vai atceltas, jo šīs izmaiņas tiek veiktas tikai lokālajā buferī vai galvenajā atmiņā iepriekšējos stāvokļos.

Apņemšanās stāvoklis: Darījums ir pabeigts un nonāk šajā stāvoklī, kad izmaiņas tiek padarītas pastāvīgas datu bāzē un tiek pārtrauktas “beigts stāvoklis”.

Izbeigšanas stāvoklis: Ja nav atcelšanas un darījums ir 'apņemšanās,' sistēma ir konsekventa un gatava jaunam darījumam, kamēr vecais tiek pārtraukts.

Transakciju ieviešana SQL serverī

Ņemsim dažus piemērus, lai saprastu, kā mēs varam ieviest darījumu SQL Server. Šeit mēs izmantosim 'Produkts' tabula, lai parādītu visus darījumu stāvokļus.

Šie SQL skripti atlasītajā datu bāzē izveido tabulu Produkts:

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

Pēc tam izpildiet tālāk norādītos skriptus, lai ievietotu datus šajā tabulā:

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

Izpildiet SELECT priekšrakstu, lai pārbaudītu datus:

SQL servera darījums

COMMIT darījuma piemērs

Darījumā izmantotos SQL paziņojumus ieteicams sadalīt vairākās loģiskās daļās. Un tad mēs varam izlemt, vai veikt vai atsaukt datus. Tālāk norādītās darbības ilustrē darījuma izveidošanu.

  • Sāciet darījumu, izmantojot SĀKT DARĪJUMU komandu.
  • Uzrakstiet SQL paziņojumus un sadaliet tos, pamatojoties uz mūsu vajadzībām
  • Izmantojiet APŅEMT izrakstu, lai pabeigtu darījumu un neatgriezeniski saglabātu izmaiņas.

Tālāk ir norādītas komandas, kas izskaidro COMMIT darbības 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 

Ja kļūda netiek atrasta, mēs redzēsim šādu izvadi, kurā katrs darījuma SQL priekšraksts tiek izpildīts neatkarīgi:

SQL servera darījums

INSERT un UPDATE priekšrakstus nevar atsaukt pēc darījuma veikšanas. Pārbaudot tabulu pēc commit darbības, mēs redzēsim šādus datus:

SQL servera darījums

ROLLBACK darījuma piemērs

Mēs izmantosim komandu ROLLBACK, lai atsauktu visus darījumus, kas vēl nav saglabāti datu bāzē, un atgrieztos vietā, kur darījums sākās. Šajā piemērā ir izskaidrota ROLLBACK darbība SQL Server:

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

Kad mēs izpildīsim iepriekš minēto darījumu, mēs varam redzēt, ka tas tiks veiksmīgi izpildīts. Tomēr tas neietekmēs nekādas izmaiņas datu bāzē, jo, kamēr mēs neizpildīsim COMMIT vai ROLLBACK priekšrakstu, izmaiņas nevar kļūt pastāvīgas. Tāpēc mums ir iespēja izmantot darījumu komandu ROLLBACK, lai atsauktu visas datu bāzes darbības. Šeit ir pilns darījuma paziņojums:

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

Globālā mainīgā @@Error izmantošana darījumos:

Šis mainīgais ir izmanto, lai pārbaudītu, vai ir vai nav kļūda. Tālāk sniegtajā piemērā ir izskaidrota tā koncepcija. Šeit mēs vispirms sāksim darījumu, izmantojot komandu BEGIN, un pēc tam ierakstīsim divus ievietošanas paziņojumus. Tālāk mēs izmantosim globālo sistēmas mainīgo @@ERROR iekš IF paziņojums lai pārbaudītu kļūdu. Ja vērtība ir lielāka par 0, tas nozīmē, ka ir kāda kļūda. Tagad darījums tiek atcelts; pretējā gadījumā darījums tiek veikts.

 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 

Kad iepriekš minētais darījums tiks izpildīts, mēs pamanīsim, ka tas ir atsaukts. Tas ir saistīts ar mūsu mēģinājumu ievietot dublikātu vērtību kolonnā Primārā atslēga.

Automātiskais atcelšanas darījums

Lielākā daļa darījumu satur vairāk nekā vienu vaicājumu. Ja darījuma izpildes laikā kāds no SQL priekšrakstiem rada kļūdu, datu bāzē netiek veiktas nekādas modifikācijas, un pārējie priekšraksti netiek izpildīti. Šī koncepcija ir pazīstama kā automātiskās atcelšanas darījums SQL Server. Lai parādītu šo procesu, izmantosim vienkāršu piemēru.

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

Šis darījums rada šādu izvadi:

SQL servera darījums

Šajā izvadē mēs redzam, ka ievietošanas priekšraksts tika veiksmīgi izpildīts. Tomēr, izpildot atjaunināšanas paziņojumu, tika atrasta kļūda datu tipa konvertēšanas problēmas dēļ. Šajā gadījumā SQL serveris neatļauj nekādas izmaiņas datu bāzē, kas nozīmē, ka ievietošanas darbība nepievieno vērtību un atlases priekšraksts netiek izpildīts.

Savepoint sadaļā Darījumi

Saglabāšanas punkts transakcijā ievieto īpašu atzīmi, kas ļauj mums atsaukt visas izmaiņas, kas veiktas pēc saglabāšanas punkta. To izmanto arī, lai atsauktu jebkuru konkrētu darījuma daļu, nevis visu darījumu. Mēs to varam definēt, izmantojot SAGLABĀT DARĪJUMU sp_name paziņojums, apgalvojums. Nākamajā piemērā ir izskaidrota saglabāšanas punkta izmantošana transakcijās, kas veic ievietošanas priekšrakstu un atceļ dzēšanas priekšrakstu.

 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; 

Skatiet tālāk redzamo rezultātu, kurā redzams, ka produkta ID 116 ir izdzēsts un 117 ir ievietots pirmajā izvadā. Tomēr otrajā izvadē dzēšanas darbība tiek atcelta saglabāšanas punkta dēļ.

SQL servera darījums

Kā darījumā atbrīvot saglabāšanas punktu?

pārvērst virkni par datumu

Atbrīvošanas saglabāšanas punkts tiek izmantots, lai noņemtu nosaukto saglabāšanas punktu no pašreizējās transakcijas, neatgriežot pēc saglabāšanas punkta izpildīto vaicājumu rezultātus. MySQL ir šī komanda, bet SQL Server nenodrošina nevienu komandu, lai atbrīvotu saglabāšanas punktu. Tā vietā tie tiek automātiski atbrīvoti saistību vai atcelšanas darījuma beigās, tāpēc mums par tiem nav jāuztraucas starpposmā.

Netieša transakcija SQL serverī

Mēs varam definēt netiešu darījumu, iespējojot opciju IMPLICIT_TRANSACTIONS. Šis piemērs viegli izskaidros šo jēdzienu:

 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 

Šajā darījumā esam izmantojuši divas iespējas @@OPTION un @@TRANCOUNT. @@OPTOPN nodrošina informāciju par pašreizējām SET opcijām, un @@TRANCOUNT nodrošina paziņojumu BEGIN TRANSACTION pašreizējā sesijā.

Tagad, izpildot darījumu, tiks atgriezta tālāk norādītā izvade:

SQL servera darījums

Skaidrs darījums SQL serverī

Skaidra transakcija ir jādefinē, izmantojot komandu BEGIN TRANSACTION, jo tā identificē skaidras transakcijas sākumpunktu. Mēs varam definēt skaidru darījumu SQL Server, kā norādīts tālāk:

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

Sintaksē opcija trans_name norāda unikālu darījuma nosaukumu. The @trans_name_var norāda lietotāja definētu mainīgo, kas saglabā darījuma nosaukumu. Visbeidzot, MARK opcija ļauj atzīmēt konkrētu darījumu žurnālfailā.

Tiešais darījums, izmantojot komandu BEGIN TRANSACTION, ieguva bloķēšanu atkarībā no ar darījumu saistīto resursu izolācijas līmeņa. Tas palīdz samazināt bloķēšanas problēmas. Skatiet tālāk redzamo piemēru:

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

Šeit ir izvade:

SQL servera darījums

Atzīmēts darījums SQL serverī

Atzīmētā transakcija tiek izmantota, lai žurnālfailos pievienotu aprakstu konkrētai transakcijai. Mēs varam to izmantot kā atkopšanas punktu datuma un laika vietā, atjaunojot datubāzi iepriekšējā stāvoklī. Mums jāzina, ka atzīme tiek pievienota žurnālfailiem tikai tad, kad atzīmētā transakcija maina datu bāzi. Mēs varam saprast tā koncepciju, izmantojot šādu piemēru.

Pieņemsim, ka esam nejauši modificējuši datu bāzi un nezinām precīzu datu izmaiņu brīdi; tādā gadījumā datu atkopšana var aizņemt ilgu laiku. Tomēr, ja mēs izmantojam atzīmētos darījumus, tas var būt noderīgs rīks, lai noteiktu precīzu datu izmaiņu laiku.

Tālāk norādītā sintakse ilustrē atzīmēto transakciju SQL Server:

 BEGIN TRANSACTION trans_name WITH MARK 'description'; 

Šeit mums jādefinē darījuma nosaukums un pēc tam jāpievieno opcija WITH MARK. Tālāk esošajā piemērā mēs izdzēsīsim ierakstus un pievienosim atzīmi žurnāla failā:

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

The logmarkhistory tabula ir iekļauta msdb datu bāze un saglabā informāciju par katru atzīmēto darījumu, kas ir veikts. Izpildiet tālāk norādīto paziņojumu, lai iegūtu informāciju no logmarkhistory tabulas:

 SELECT * FROM msdb.dbo.logmarkhistory 

Nosaukts darījums SQL serverī

Mēs varam arī norādīt mūsu darījuma nosaukumu SQL Server. Vienmēr ir ieteicams izmantot nosaukto transakciju, strādājot ar daudziem darījumiem vienā vaicājumā. Tālāk sniegtajā piemērā ir paskaidrots, kā pārdēvēt darījumu:

 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 

Šeit ir izvade:

SQL servera darījums

Secinājums

Šajā rakstā tiks sniegts pilnīgs pārskats par darījumu SQL Server priekšrakstos. Darījumi ir noderīgi relāciju datu bāzu sistēmās, jo tie nodrošina datu bāzes integritāti.