Управление на транзакциите в Oracle
ORACLE се фокусира върху използването на сделката, с други думи, тя използва сделки да се гарантира целостта на данните. СДЕЛКИ - е поредица от операции, SQL данни манипулация, които изпълняват логическа единица работа. Например, две UPDATE операции придават една банкова сметка, а друг debitiruyut. В един момент от време или ORACLE го прави постоянно или премахва всички промени в базата данни, сделката. Ако вашата програма слиза в средата на сделка, ORACLE открие грешка и изпълнява анулиране (намаление на цените) сделки. Вследствие на базата данни автоматично ще се върне към предишното му състояние.
За управление на сделки с използване на COMMIT команда, отказвайте SAVEPOINTiSETTRANSACTION. COMMIT прави постоянни всички промени в базата данни, направени през текущата сделката ( "Потвърди" транзакция) .Преди това докато не потвърдите промените, други потребители не могат да ги видят. ROLLBACK свършва сегашната сделка и премахва всички промени, направени, тъй като тя започна. Точка на запис бележи текущата точка на обработката на транзакции. Заедно с намаление на цените, точка на запис команда ви позволява да отмените част от сделката. SET СДЕЛКИ определя режим на транзакция
обработка на транзакции
Първият SQL изявление във вашата програма започва на сделка. Когато една операция завърши, следващата SQL изявление автоматично започва следващата сделката. По този начин, всеки SQL изречение е част от сделката.
Оферта COMMIT свършва сегашната сделка и прави постоянни всички промени, направени по време на тази сделка. До този момент, останалите потребители не могат да видят променила данните; те виждат данните в същото състояние, както е било в началото на сделката.
Помислете за една проста операция, която извършва прехвърлянето на пари от една сметка в друга. Тази сделка изисква две операции актуализация (UPDATE), тъй като тя трябва да теглим една сметка и кредитна другия. След кредитиране втората сметка, която издава COMMIT команда, като промените за постоянно. Едва след това новото състояние на сметките е видим за другите потребители.
UPDATE accts SET BAL = my_bal - дебитни
КЪДЕТО acctno = 7715;
UPDATE accts SET кредитни бал = my_bal +
КЪДЕТО acctno = 7720;
По желание на ключова дума няма никакъв ефект, освен подобри четливостта.
COMMIT Оферта освобождава всички заключване на таблици и ред. Той също така изтрива всички точки на запис (обсъдени по-долу), отбелязани след последния или отхвърлянето на промените.
Оферта противоположния ROLLBACK COMMIT. Тя завършва сегашната сделка и премахва всички промени, направени по време на тази сделка. ROLLBACK предложение е полезно поради две причини.:
Ако направите грешка, например, са отстранени грешен ред от базата данни, можете да използвате ROLLBACK да възстанови първоначалните данни. Вариант ROLLBACKTOpozvolyaet отмените промени в междинна точка в сегашната сделка, така че не е нужно да се изтрие всичките ви промени.
ROLLBACK предоставят полезна, когато започнете сделка, която не е в състояние да завърши, например, в отчета за SQL или грешка изключение. В такива случаи ROLLBACK ви позволява да се върнете към началната точка, така че може да предприеме коригиращи действия и опитайте отново операцията отново.
Да разгледаме следния пример, в който да поставите информация за служител в три различни таблиците в базата данни. И трите маси имат колона, съдържаща номера на служителите и ограничава уникален индекс. Ако отчета за INSERT се опитва да поставите два екземпляра брой на служителите, повдига предварително определен изключение DUP_VAL_ON_INDEX. В този случай е необходимо да отмените всички промени. Затова ви издаде ROLLBACK в изключение манипулатор.
SELECT empno. В emp_id. ОТ КЪДЕ new_emp.
INSERT INTO EMP стойности (emp_id.);
INSERT INTO данъчните стойности (emp_id.);
INSERT INTO заплащане СТОЙНОСТИ (emp_id.);
КОГАТО DUP_VAL_ON_INDEX ТОГАВА
Отдръпва на нивото на предложения
Преди изпълнение на SQL изявление, ORACLE предоставя косвена точка на запис. След това, ако това предложение се заблуждава, ORACLE автоматично изпълнява намаление на цените. Например, ако изявление вложка се опитва да се вмъкне дубликат стойност по уникален индекс, тя се завъртя обратно. В този случай, само работата е загубена, започна сгушени оферта SQL; всички прави в сегашната сделка до този момент работата, не е засегната.
Преди изпълнение на SQL изявление, ORACLE трябва да изпълнява своята CASE (синтактичен анализ), т.е. го изследва с цел да гарантира, че тя е синтактично правилни и се отнася за валидни обекти на базата данни. Грешки, открити при анализирането на изречения (за разлика от по време на изпълнение грешки) не водят до намаление на цените.
Точка на запис на имена и марки текущата точка (освен точка) в процеса на сделката. Тази точка се използва в намаление на цените да осъди ви позволява да отмените част от сделката. В следващия пример, можете да маркирате точка на запис, преди да извършите вложка ред. Ако отчета за INSERT се опитва да се вмъкне дубликат стойност в колоната empno, има предварително определен изключение DUP_VAL_ON_INDEX. В този случай, можете да върнете към точката за спасяване, анулирането на кутия.
UPDATE ЕМИ SET. КЪДЕТО empno = emp_id;
Изтрий от ЕМИ КЪДЕ.
INSERT INTO EMP стойности (emp_id.);
КОГАТО DUP_VAL_ON_INDEX ТОГАВА
ROLLBACK TO do_insert;
Когато се върне назад към всички точки на запис с надпис след каза изтрити, както и всички промени, направени след този момент, се отхвърлят. Въпреки това, много опазването на точката, до която се върнат, не е премахнат. Например, ако вие ще обърнете внимание, последователно се съхранява точка А, B и C D, и след това да извършите ROLLBACK TO до точка Б, той ще бъде изтрит само C и D.
ROLLBACK без аргументи, като COMMIT, изтрива всички точки на запис.
Ако маркирате точка на запис в рекурсивно рутина, а след това на всяко ниво на предложението за рекурсивно спускане точка на запис ще създаде нови случаи на точки на запис. Въпреки ROLLBACK TO ще ви отнеме само до най-новата точка на запис с това име.
Имена точки на запис - това необявени идентификатори. Те могат да се използват повторно в рамките на една сделка. В този спаси точка е изместен от старата си позиция до текущата точка на сделката. По този начин, намаление на цените до точка на запис засяга само текущия част на транзакциите си. Да разгледаме следния пример:
UPDATE ЕМИ SET. КЪДЕТО empno = emp_id;
Точка на запис my_point; - премества в сегашната точка my_point
INSERT INTO EMP стойности (emp_id.);
Когато другите THEN
ROLLBACK TO my_point;
По подразбиране, а броят на активните точки на запис на сесия не може да бъде повече от 5. АКТИВНО спаси точка - точка, отбеляза след последния или отхвърлянето на промените. Вие или DBA може да повиши този лимит (до 255), увеличаване на стойността на параметъра ORACLE инициализация наречени точки на запис.
Скритият точки за запазване
Преди всяко вписване, актуализиране и изтриване на ORACLE създава имплицитен точка на запис (недостъпен за вас). Ако предложението се заблуждава, тя се завъртя обратно към мълчаливия точка. само сгушени SQL изявление обикновено е отменен, но не и цялата сделка.
Един добър програмиране практика е да се потвърди или изрично изрично намаление на цените на всяка сделка. Ако пренебрегнем да изчисти сделки или отхвърлянето на промените, той определя крайното състояние на самата база данни на сделката.
Например, ако вашият PL / SQL блок не съдържа предложения или отхвърлянето на промените, то крайното състояние на транзакцията ви зависи от това, което правите, след като това устройство:
Ако извършите стъпките за определяне на данни, операции за управление на данни или да извърши операция, или ако издаде заповед EXIT, изключете или откажат,
ORACLE е имплицитно потвърждава вашата сделка.
Ако извършите операция ROLLBACK или извънредно заседание стрелба
След това ORACLEvypolnyaet се връщам на сделката.
IspolzovanieSETTRANSACTION
Тих режим за всички транзакции, е съставът на данните за четене НИВО OPERATsII.T.e. поискване вижда само състоянието на данните, която е преди началото на неговото изпълнение, както и всички промени, направени в предишната операция в текущата сделката. Ако по време на заявката други потребители (транзакция) прави промени в същата таблица на база данни, тези промени ще бъдат видими само продължава, но не по текущата едно искане.
Можете обаче, издаване предложение SET СДЕЛКИ, установи съгласуваност в режим на четене на ниво транзакция. Това гарантира, че заявката вижда само състоянието на данните, което беше потвърдено преди началото на цялата транзакция; обаче, сделката не трябва да прави всякакви промени в базата данни. Оферта SET СДЕЛКИ ПРОЧЕТЕТЕ САМО не приема допълнителни параметри и има следния вид:
SET СДЕЛКИ ПРОЧЕТЕТЕ САМО;
Задайте офертата СДЕЛКИ трябва пръв да предложи SQL сделки и само веднъж на сделката може да се случи. Както вече беше посочено, в този режим, всички транзакции искания, издадено в
го вижда състоянието на данните, което беше потвърдено преди началото на цялата сделка. Режим само за четене не влияе на други потребители или други сделки.
Транзакциите само за четене се допускат само SELECT изявление, COMMITiROLLBACK. Други предложения, като например, INSERT или DELETE, водят до изключване на възбуждане.
По време на сделката ПРОЧЕТЕТЕ САМО всичките си искания се отнасят за една и съща снимка базата данни, която осигурява много-маса, mnogozaprosnoe, оглед четене съответства на данните за транзакцията. Останалите потребители ще могат да продължат да задава въпроси или да актуализират данните, както обикновено.
Сделката е прекратено издаването само за четене или отхвърлянето на промените. В примера ти, като склада на мениджър използване сделка само за четене, за да се съберат данни за продажбите на ден, миналата седмица и през последния месец. Тези цифри не могат да повлияят на други потребители актуализиране на базата данни по време на
SET СДЕЛКИ ПРОЧЕТЕТЕ САМО;
SELECT SUM (AMT) В daily_sales от продажби
КЪДЕТО DTE = SYSDATE;
SELECT SUM (AMT) В weekly_sales от продажби
КЪДЕТО DTE> SYSDATE - 7;
SELECT SUM (AMT) В monthly_sales от продажби
COMMIT; - това е просто един сигнал за приключване на сделката, тъй като всички промени, които прави
Замяна на тиха пресечка
По подразбиране, ORACLE автоматично блокира за структурата на данните. Въпреки това, можете да направите заявка за конкретен блок на редовете или таблици, ако по някаква причина или полза за промяна на режима на заключване мълчи. Изрично заключване ви позволява да разрешите или забраните поделен достъп до таблицата в момента на сделката.
Използването ЗА АКТУАЛИЗАЦИЯ
CURSOR C1 е SELECT empno Сал ОТ ЕМИ
КЪДЕ = работа "продавач" И кому> Сал ЗА АКТУАЛИЗАЦИЯ;
UPDATE EMP SET сол = new_sal;
Фразата ЗА АКТУАЛИЗАЦИЯ показва, че низа, изберете заявката ще бъде актуализирана или изтрита, и заключва всички редове в активния набор от курсора. Това е полезно, когато искате да се актуализира въз основа на текущата стойност на низа. В този случай, трябва да имате гаранция, че линията няма да се промени от друг потребител, преди да го ъпгрейд. Всички редове в групата активни са заключени по време на курсора се отваря и отключени, когато извършил.
Извличане между COMMIT'ami
Фразата ЗА АКТУАЛИЗАЦИЯ изисква изключително заключване редове. Всички редове в групата активни са блокирани
по време на откриването на курсора, а не по време на техния добив. Всички линии са освободени след приключване на сделката (COMMIT или ROLLBACK). Следователно, вие не може да извлече редове от курсора обявен за осъвременяване, след като извършил. Ако се опитате да направите това, по изключение се случи. Помислете за следващия цикъл ЗА, който прати след десетата вложка:
CURSOR C1 е SELECT РЕДАКТОР НА ЕМИ ЗА АКТУАЛИЗАЦИЯ НА сол;
ЗА ПО emp_rec в1 LOOP - скритите операции FETCH
INSERT INTO временни стойности (CTR ", все още се работи");
АКО CTR> = 10 Тогава
COMMIT; - пресата ключалки
Ако ще да се извърши COMMIT, без да завършат всички екстракции, не използвайте фразата за осъвременяване.
Ако не се използва фразата ЗА АКТУАЛИЗАЦИЯ НА, премахване на линията не е блокиран. Така че можете да
получите противоречиви резултати, ако друг потребител модифицира един ред, след като го прочете, но преди да го промените.
Използването LOCK TABLE
Оферта LOCK TABLE ви позволява да заключите една или повече таблици в този режим, така че можете да регулирате едновременно достъп до таблиците, запазвайки тяхната цялост. Например, предложението посочени по-долу, блокове ЕМИ маса в режим на акции ред. Този режим позволява едновременен достъп до масата, но позволява на други потребители да се заключва цялата таблица за изключително ползване. заключване на маса се отделя, когато транзакцията ви издава или отхвърлянето на промените.
LOCK ТАБЛИЦА EMP В РЕД ДЯЛ MODE NOWAIT;
заключване режим определя какви други брави могат да бъдат приложени към масата. Например, няколко потребителя едновременно могат да поискат заключване за поредна акция на една маса, но само един потребител в даден момент да направите заявка за монопол (не се брои) заключване. Докато един потребител има изключително заключване на масата, други потребители не могат да променят (вмъкване, обновяване или изтриване) редове на тази таблица.
по желание NOWAIT Ключовата дума се посочва, че ако искането за LOCK TABLE не може да бъде удовлетворена (вероятно защото таблицата вече е заключен от друг потребител), маса за заключване ще се върне контрол на потребителя, вместо да чака да отговори на искането. Ако пропуснете NOWAIT ключовата дума, а след това ORACLE ще чака на масата; това очакване не е поставил граници.