logo

Трансакција СКЛ сервера

Трансакција у СКЛ Серверу је а секвенцијална група исказа или упита за обављање једног или више задатака у бази података. Свака трансакција може имати једну операцију читања, писања, ажурирања или брисања или комбинацију свих ових операција. Свака трансакција мора да се деси две ствари у СКЛ Серверу:

  • Свака модификација је успешна када се трансакција изврши.
  • Или се све модификације поништавају када се трансакција врати.

Трансакција не може бити успешна док се не заврше све операције у скупу. То значи да ако било који аргумент не успе, операција трансакције неће успети. Свака трансакција почиње са првом извршном СКЛ наредбом и завршава се када пронађе урезивање или враћање, експлицитно или имплицитно. Користи се УРАДИТИ или РОЛЛБАЦК експлицитно, као и имплицитно када се користи ДДЛ исказ.

Сликовни приказ у наставку објашњава процес трансакције:

Трансакција СКЛ сервера

Следећи пример ће објаснити концепт трансакције:

Овај пример ће користити систем банкарске базе података да објасни концепт трансакције. Претпоставимо да клијент банке жели да подигне новац са свог рачуна користећи АТМ режим. Банкомат може да изврши ову операцију у три корака:

разлика у питону
  1. Тхе Први корак је да провери доступност траженог износа на рачуну.
  2. Тхе други корак одузима износ са рачуна ако је износ доступан, а затим ажурира стање на рачуну.
  3. Тхе трећи корак је да запише операцију подизања новца у датотеку евиденције. Овај корак пише да је трансакција или успешна или неуспешна. Ако успе, упишите измену података у базу података. У супротном, трансакција ће бити враћена у претходно стање.

Основни принцип који стоји иза трансакција је да ако једна од изјава врати грешку, цео скуп измена се поништава да би се обезбедио интегритет података. А ако трансакције постану успешне, све промене ће бити трајне у бази података. Стога, ако дође до нестанка струје или других проблема приликом подизања новца са банкомата, трансакције гарантују да ће наш баланс остати доследан. Изјава о трансакцији најбоље изводи ове операције јер четири кључна својства трансакције чине све операције тачнијим и конзистентнијим. Четири својства трансакције се називају АЦИД.

Својства трансакције

Својства трансакције се називају својством АЦИД (атомичност, конзистентност, изолација, издржљивост), о чему се детаљно говори у наставку:

Трансакција СКЛ сервера

атомичност: Ово својство осигурава да се све изјаве или операције укључене у трансакцију морају успешно извршити. У супротном, цела трансакција ће бити прекинута, а све операције се враћају у претходно стање када било која операција не успе.

конзистентност: Ово својство осигурава да база података мења стање само када ће трансакција бити успешно урезана. Такође је одговоран за заштиту података од рушења.

Изолација: Ово својство гарантује да су све трансакције изоловане од других трансакција, што значи да се свака операција у трансакцији обавља независно. Такође осигурава да изјаве буду транспарентне једна другој.

Трајност: Ово својство гарантује да ће резултат извршених трансакција трајно остати у бази података чак и ако се систем сруши или не успе.

Трансакциони режими у СКЛ Серверу

Постоје три различита режима трансакције које СКЛ Сервер може да користи:

Режим трансакције са аутоматским урезивањем: То је подразумевани режим трансакције СКЛ Сервера. Он ће проценити сваку СКЛ наредбу као трансакцију, а резултати се у складу са тим урезују или враћају назад. Тако се успешне изјаве одмах урезују, док се неуспеле изјаве одмах враћају назад.

Имплицитни режим трансакције. Овај режим омогућава СКЛ Серверу да започне имплицитну трансакцију за сваки ДМЛ израз, али изричито захтева употребу наредби урезивања или враћања на крај наредби.

Експлицитни режим трансакције: Овај режим дефинише корисник који нам омогућава да тачно идентификујемо почетну и завршну тачку трансакције. Аутоматски ће се прекинути у случају фаталне грешке.

Контрола трансакција

Следе команде које се користе за контролу трансакција:

    ЗАПОЧНИ ТРАНСАКЦИЈУ:То је команда која означава почетак сваке трансакције.УРАДИТИ:То је команда која се користи за трајно чување промена у бази података.РОЛЛБАЦК:То је команда која се користи за поништавање свих модификација и прелазак у претходно стање.ТОЧКА УШТЕДЕ:Ова команда креира тачке унутар група трансакција које нам омогућавају да вратимо само део трансакције, а не целу трансакцију.ОТПУСТИ ТАЧКУ ЧУВАЊА:Користи се за уклањање већ постојеће САВЕПОИНТ.ПОДЕШАВАЊЕ ТРАНСАКЦИЈЕ:Ова команда даје трансакцији име, које се може користити да буде само за читање или читање/писање или да се додели одређеном сегменту за враћање.

НАПОМЕНА: За команде језика контроле трансакција можемо користити само ДМЛ изразе (ИНСЕРТ, УПДАТЕ и ДЕЛЕТЕ). Не можемо их користити док креирамо или испуштамо табеле јер се ове операције аутоматски предају бази података.

Трансацтион Стате

Означава како се трансакције одвијају током њиховог животног века. Описује тренутно стање трансакције, као и начин на који ће трансакција бити обрађена у будућности. Ова стања дефинишу правила која одређују да ли ће се трансакција извршити или прекинути.

Трансакција СКЛ сервера

Хајде да опишемо стање сваке трансакције у СКЛ Серверу:

Активно стање: Трансакција је у активном стању док се инструкције трансакције извршавају. Мења се у 'делимично посвећено стање' ако су све операције 'читања и писања' завршене без грешака. Ако било која инструкција не успе, мења се у „неуспешно стање“.

Делимично посвећен: Када су све операције читања и писања завршене, промена се врши у главној меморији или локалном баферу. Држава би отишла у 'посвећено стање' ако су промене трајне на бази података. У супротном, иде у 'неуспешно стање'.

Неуспешно стање: Трансакција прелази у неуспешно стање када инструкција било које трансакције не успе или трајна модификација базе података не успе.

Прекинуто стање: Трансакција се креће од а 'пропала држава' то ан 'побачено стање' када дође до било каквог квара. Промене се уклањају или враћају назад јер се ове промене врше само у локалном баферу или главној меморији у претходним стањима.

Посвећено стање: Трансакција је завршена и прелази у ово стање када промене постану трајне у бази података и прекинуте у 'укинуто стање'.

Прекинуто стање: Ако нема враћања и трансакција је у 'посвећено стање' систем је конзистентан и спреман за нову трансакцију док је стара прекинута.

Имплементација трансакције у СКЛ Сервер

Узмимо неколико примера да бисмо разумели како можемо да имплементирамо трансакцију у СКЛ Сервер. Овде ћемо користити 'Производ' табела за приказ свих стања трансакција.

Следеће СКЛ скрипте креирају табелу производа у изабраној бази података:

стринг у Ц++
 CREATE TABLE Product ( Product_id INT PRIMARY KEY, Product_name VARCHAR(40), Price INT, Quantity INT ) 

Затим извршите следеће скрипте да бисте уметнули податке у ову табелу:

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

Извршите наредбу СЕЛЕЦТ да бисте проверили податке:

СКЛ Сервер Трансакција

Пример трансакције ЦОММИТ

Добра је идеја поделити СКЛ изјаве које се користе у трансакцији на више логичких делова. А онда, можемо одлучити да ли да извршимо или вратимо податке. Следећи кораци илуструју креирање трансакције:

  • Започните трансакцију користећи ПОЧНИ ТРАНСАКЦИЈУ команда.
  • Напишите СКЛ изразе и поделите их на основу наших потреба
  • Користити УРАДИТИ изјаву да довршите трансакцију и трајно сачувате промене.

Испод су команде које објашњавају операције ЦОММИТ у СКЛ Серверу:

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

Ако није пронађена грешка, видећемо следећи излаз где се свака СКЛ изјава трансакције извршава независно:

СКЛ Сервер Трансакција

Наредбе ИНСЕРТ и УПДАТЕ се не могу вратити назад након што је трансакција урезана. Када верификујемо табелу након операције урезивања, видећемо следеће податке:

СКЛ Сервер Трансакција

Пример трансакције РОЛЛБАЦК

Користићемо команду РОЛЛБАЦК да поништимо све трансакције које још нису сачуване у бази података и вратимо се на тачку где је трансакција почела. Следећи пример објашњава операцију РОЛЛБАЦК у СКЛ Серверу:

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

Када извршимо горњу трансакцију, можемо видети да ће она бити успешно извршена. Међутим, то неће утицати ни на какве промене у бази података јер све док не извршимо наредбу ЦОММИТ или РОЛЛБАЦК, промене не могу постати трајне. Због тога имамо опцију да користимо команду трансакције РОЛЛБАЦК за враћање свих операција базе података. Ево комплетне изјаве о трансакцији:

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

Коришћење глобалне променљиве @@Еррор у трансакцијама:

Ова варијабла је користи се за проверу да ли постоји грешка или не. Пример у наставку објашњава њен концепт. Овде ћемо прво покренути трансакцију помоћу команде БЕГИН, а затим ћемо написати две изјаве за уметање. Затим ћемо користити глобалну системску променљиву @@ЕРРОР у ИФ изјава да проверите грешку. Ако је вредност већа од 0, то значи да је дошло до грешке. Сада је трансакција поништена; у супротном, трансакција је обавезна.

 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 

Када се горња трансакција изврши, приметићемо да је враћена. То је због нашег покушаја да убацимо дупликат вредности у колону Примарни кључ.

Трансакција аутоматског враћања

Већина трансакција садржи више од једног упита. Током извршавања трансакције, ако било која од СКЛ наредби произведе грешку, у бази података не долази до модификација, а преостали изрази се не извршавају. Овај концепт је познат као трансакција аутоматског враћања унатраг у СКЛ Серверу. Хајде да употребимо једноставан пример да демонстрирамо овај процес.

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

Ова трансакција производи следећи излаз:

Трансакција СКЛ сервера

У овом излазу можемо видети да је наредба инсерт успешно извршена. Међутим, приликом извршавања наредбе ажурирања пронађена је грешка због проблема са конверзијом типа података. У овом случају, СКЛ Сервер не дозвољава никакве измене у бази података, што значи да операција уметања не додаје никакву вредност и наредба селецт се не извршава.

Тачка чувања у трансакцијама

Тачка чувања убацује посебну ознаку у трансакцију која нам омогућава да вратимо све промене извршене након тачке чувања. Такође се користи за враћање било којег одређеног дела трансакције, а не целе трансакције. Можемо га дефинисати коришћењем САВЕ ТРАНСАЦТИОН сп_наме изјава. Следећи пример ће објаснити употребу тачке чувања у трансакцијама које урезују наредбу уметања и враћају наредбу за брисање.

 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; 

Погледајте доњи резултат где можемо видети да је ИД производа 116 обрисан, а 117 уметнут у први излаз. Међутим, у другом излазу, операција брисања се враћа уназад због тачке чувања.

СКЛ Сервер Трансакција

Како ослободити тачку чувања у трансакцији?

Отпуштање тачке чувања се користи за уклањање именоване тачке чувања из тренутне трансакције без враћања резултата упита извршених након тачке чувања. МиСКЛ има ову команду, али СКЛ Сервер не пружа ниједну команду за ослобађање тачке чувања. Уместо тога, они се аутоматски ослобађају на крају трансакције урезивања или враћања, тако да не морамо да бринемо о њима у међувремену.

Имплицитна трансакција у СКЛ Серверу

Можемо да дефинишемо имплицитну трансакцију тако што ћемо омогућити опцију ИМПЛИЦИТ_ТРАНСАЦТИОНС. Следећи пример ће лако објаснити овај концепт:

 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 

У овој трансакцији користили смо две опције @@ОПТИОН и @@ТРАНЦОУНТ. @@ОПТОПН пружа информације у вези са тренутним опцијама СЕТ, а @@ТРАНЦОУНТ пружа наредбу БЕГИН ТРАНСАЦТИОН у тренутној сесији.

Сада, извршавање трансакције ће вратити следећи излаз:

СКЛ Сервер Трансакција

Експлицитна трансакција у СКЛ Серверу

Експлицитна трансакција мора бити дефинисана преко команде БЕГИН ТРАНСАЦТИОН јер идентификује почетну тачку експлицитне трансакције. Експлицитну трансакцију у СКЛ Сервер-у можемо дефинисати на следећи начин:

преименуј директоријум линук
 BEGIN TRANSACTION [ @trans_name_variable [WITH MARK ['description']]] 

У синтакси, опција транс_наме означава јединствено име трансакције. Тхе @транс_наме_вар означава кориснички дефинисану променљиву која чува назив трансакције. Коначно, МАРК опција нам омогућава да означимо одређену трансакцију у датотеци евиденције.

Експлицитна трансакција преко команде БЕГИН ТРАНСАЦТИОН је добила закључавање у зависности од нивоа изолације ресурса који се односе на трансакцију. Помаже у смањењу проблема са закључавањем. Погледајте пример у наставку:

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

Ево излаза:

СКЛ Сервер Трансакција

Означена трансакција у СКЛ Серверу

Означена трансакција се користи за додавање описа одређеној трансакцији у фајловима евиденције. Можемо га користити као тачку за опоравак уместо датума и времена када враћамо базу података у претходно стање. Морамо знати да се ознака додаје у датотеке евиденције само када означена трансакција модификује базу података. Његов концепт можемо разумети користећи следећи пример.

Претпоставимо да смо случајно изменили базу података и не знамо тачан тренутак измене података; у том случају, опоравак података може потрајати дуго. Међутим, ако користимо означене трансакције, то може бити корисно средство за одређивање тачног времена измене података.

Следећа синтакса илуструје означену трансакцију у СКЛ Серверу:

 BEGIN TRANSACTION trans_name WITH MARK 'description'; 

Овде морамо да дефинишемо име трансакције, а затим да додамо опцију ВИТХ МАРК. У следећем примеру, избрисаћемо записе и додати ознаку у датотеку евиденције:

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

Тхе логмаркхистори табела је укључена у мсдб база података и чува информације у вези са сваком означеном трансакцијом која је извршена. Извршите наредбу у наставку да бисте добили детаље из табеле логмаркхистори:

 SELECT * FROM msdb.dbo.logmarkhistory 

Именована трансакција у СКЛ Серверу

Такође можемо дати име за нашу трансакцију у СКЛ Серверу. Увек се препоручује коришћење именоване трансакције када радите са више трансакција у једном упиту. Пример у наставку објашњава како да преименујете трансакцију:

 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 

Ево излаза:

СКЛ Сервер Трансакција

Закључак

Овај чланак ће дати потпуни преглед трансакције у СКЛ Сервер изјавама. Трансакције су корисне у системима релационих база података јер обезбеђују интегритет базе података.