32
Енді мысал ретінде қолайыз жазба енгізіледі:
INSERT INTO weather VALUES ('Berkeley', 45, 53, 0.0, '1994-11-28');
ОШИБКА: INSERT или UPDATE в таблице "weather" нарушает ограничение
внешнего
ключа "weather_city_fkey"
ПОДРОБНОСТИ: Ключ (city)=(Berkeley) отсутствует в таблице "cities".
Пайдаланушы қосымшасының талабы бойынша ішкі кілттердің
мінез
құлқын орналастыруға болады.
4.3 Транзакциялар
Транзакциялар
бұл барлық ДҚБЖ негізгі іргетасы. Транзакциялар
мағынасы әсерлер тізімін бір «барлығы немесе ештеңе» операциясына
біріктіргенінде. Тізім ішіндегі интервал жағдайлары басқа транзакцияларға
көрінбейді, және де егер транзакцияны сәтті аяқтауға бір нәрсе бөгет болған
жағдайда, осы амалдардың бірде
біреуі деректер қорында сақталмайды.
Мысалы, клиент шоттары және банк филиалдарының ортақ сомасы туралы
мәлімет бар банктің деректер қоры қарастырылады. Алиса шотынан Боб
шотына
100
доллар
ауыстыру
керек.
Жеңілдік
үшін
сәйкес
SQL
командаларын келесі түрде жазуға болады:
UPDATE accounts SET balance = balance - 100.00
WHERE name = 'Alice';
UPDATE branches SET balance = balance - 100.00
WHERE name = (SELECT branch_name FROM accounts WHERE name =
'Alice');
UPDATE accounts SET balance = balance + 100.00
WHERE name = 'Bob';
UPDATE branches SET balance = balance + 100.00
WHERE name = (SELECT branch_name FROM accounts WHERE name = 'Bob');
Командалардың нақты мазмұны мазмұны маңызды емес; маңыздысы тек
осы қарапайым операцияны орындауға бірнеше жеке операция орындау қажет
болғаны. Сонымен қатар банк тұрғысынан қарағанда осы амалдардың бәрі
бірге орындалғаны қажет, немесе мүлдем орындалмауы тиіс. Егер Боб 100
доллар алса, бірақ Алисаның шотынан алынбаса, бұны жүйенің қателігі деп
айтуға болмайды. Және, керісінше, Алиса ақша аударып Бобқа жетпеген
жағдай да жақсы деп атауға келмейді. Операцияны соңына дейін орындауға
бір нәрсе бөгет болған жағдайда, бір де бір амал деректер қорында ізін
қалдырмайды деген кепілдік керек. Ондай кепілдікті амалдарды бір
транзакцияға бірітіру жолымен алады. Транзакция атомарлық дейді
басқа
транзакциялар тұрғысынан ол орындалып толық бекітіледі немесе мүлдем
бекітілмейді. Сонымен қатар кепілдік керек: аяқталғаннан кейін және
деректер қоры жүйесімен транзакция расталғаннан кейін, оның нәтижелері
шынында сақталады және апат болған жағдайдың өзінде жоғалмайды.
Мысалы, егер сомасы есептен шығарылды және Бобқа берілді; ол банктен
33
шыққан сәтте шотындаңы сомасы қайта орнына келу мүмкіндігін болдырмау
керек. Транзакциондық деректер қоры барлық өзгертулер транзакция
аяқталғанша тұрақты қоймада (мысалы, дискіге) сақаталады деген кепілдік
береді. Транзакциялық деректер қорының басқа маңызды сипаттамасы
атомарлық өзгертулермен тығыз байланысты: бір уақытта бірнеше
транзакциялар орындалған сәтте олардың әрқайсысы басқалары орындайтын
аяқталмаған өзгертулерді көрмейді. Мысалы, егер бір транзакция бөлім
бойынша балансты санап жатқан уақытта, егер Боб бөлімін келуді
қарастырмай, Алисаның бөліміндегі шығынды санаса дұрыс емес болады.
Сол себептен транзакция «барлығы немесе ештеңе» қасиеті өзгертулер
деректер қорында қалай сақталатыны ғана емес, сонымен қатар жұмыс
процесінде қалай көрінетінін анықтау керек. Ашық транзакция өндіретін
өзгертулер операция аяқьалғанша басқа транзакцияларға көрінбейді, одан
кейін олардың барлығы бәріне бірден көрінеді. PostgreSQL транзакциялар
SQL
командалар жиынтығымен анықталады, BEGIN және
COMMIT командаларымен қоршалған. Осылайша, банк транзакциясы келесі
түрде болуы керек еді:
BEGIN;
Расширенные возможности
16
UPDATE accounts SET balance = balance - 100.00
WHERE name = 'Alice';
-- ...
COMMIT;
Егер транзакция орындау процесінде олардың өзгертулерін бекітпеу
шешімі қабылданса (мысалы, Алиса балансы минус болса), COMMIT орнына
ROLLBACK командасын орындауға болады, және барлық өзгертулер күшін
жояды.
PostgreSQL шынында барлық SQL
операторды транзакция ретінде
өңдейді. Егер пайдаланушы BEGIN командасын қоймаса, онда әрбір жеке
оператор айқын емес BEGIN және COMMIT командаларымен қоршалаып
қалады (сәтті аяқталу жағдайында). BEGIN және COMMIT командаларымен
қоршалатын операторлар тобын кейде транзакция блогы деп атайды. Кейбір
клиенттік кітапханалар BEGIN және COMMIT командаларын автоматты түрде
қосады және пайдаланушы орнына айқын емес транзакция блоктарын
жасайды. Транзакциялардағы операторлармен сақтау нүктелерін қолдана
отырып егжей
тегжейлі басқаруға болады. Сақтау нүктелері таңдаулы түрде
транзакцияның кейбір бөліктерінің күшін жойдыруға және қалғандарын
бекітуге мүмкіндік береді. Сақтау нүктесін SAVEPOINT көмегімен анықтап,
керек болса оған ROLLBACK TO командасы көмегі арқылы қайта оралуға
болады. Сақтау нүктесінен қайтарымға дейінгі деректер қорында болған
барлық өзгерістер күшін жояды, бірақ алдында болған өзгерістер сақталады.
Пайдаланушы сақтау нүктесіне қайта келгенде нүкте жұмысын жалғастырады;
оған бірнеше рет қайтарым орындай аласыз. Басқа жағынан қарағанда,