1.01M
Категория: Базы данныхБазы данных

Транзакцияларни бошқариш. Сўровларни яратиш ва қайта ишлаш

1.

12-Маъруза.
Транзакцияларни
бошқариш. Сўровларни
яратиш ва қайта ишлаш.

2.

1.
2.
3.
4.
5.
6.
7.
Транзакция тушунчаси
ACID – талабалари
ТарВарианты завершения транзакций
Блокировкалар
Транзакцияларни бажаришдаги
муаммолар
Блокировкалаш даражалари
MYSQL да транзакцияларни бошқариш

3.

Понятие транзакции
Транзакция – бу МБ устида бажариладиган ягона бутун деб
қараладиган амаллар кетма-кетлиги бўлиб, у МБ ни бир бутун
холатдан бошқа бутун холатга ўтказади.
Транзакцияга кирувчи амаллар сони биттадан
юзлагангача бўлиши мумкин
Ишлаб чиқувчи (дастурчи, МБ администратори ) қайси
командалар ягона транзакция каби қайси командалар
алохида транзакция сифатида бажарилишини белилайди
МББТ транзакцияларни бажаришда тизим ишини тўғрилигини ва
ишончлилигини кафотлатлаш учун транзакциядаги командалар
тўпламини қайта ишланишини таъминлаши зарур
Транзакция ACID – талабаларни қаноатлантириш керак.

4.

ACID – талаблар
ACID – талаблар тизим ишини тўғрилигини ва ишончлилигини
кафотлатлайди
Atomic (атомарлик) Транзакция қисман бажарилмайди, тўлиқ
бажарилади ёки умуман бажарилмайди.
Consistency
(мослик)
Транзакция бажарилгандан кейин МБ барча
маълумотлар мос (реал дунёга ва бизнес
қоидаларга) холатда бўлиши керак.
Isolation
(изолация)
Транзакция автоном бўлиши ва бошқа
транзакцияларга таъсир қилмаслиги ёки боғлиқ
бўлмаслиги керак.
Durability
(турғунлик)
Транзакция тугагандан кейин киритилган
ўзгаришлар ўзгармаслиги лозим.
ACID - тарнзакцияларни қайта ишлаш тизимини фундаментал

5.

Транзакцияларни тугаш вариантлари
Транзакцияни 2 та тугаш варианти
мавжуд
Муваффақиятли
Барча амаллар
бажарилиши
Транзакцияни қайд
қилиш COMMIT
Транзакцияни қайд қилиш – бу
амал, транзакция натижасида
Мбда бўлган ўзгаришларни
дискда сақланишини (қайд
қилинишини) таъминлайди
Муваффақиятсиз
Транзакцияни бекор
қилиш ROLLBACK
Транзакцияни бекор қилиш –
бу амал транзакция натижасида
МБда юз берган барча
ўзгаришларни бекор қилади

6.

Блокировкалар
Транзакциялар билан ишлаш самарадорлиги сервер томонидан
транзакцияларни
бажаришда
маълумотларга
қўйиладиган
блокировкалар билан боғлиқ.
Блокировка бу маълумотларни қайта ишловчи операцияларга
нисбатан вақтинча қўйиладиган чекловдир. Блокировка жадвалнинг
алохида сатрига ёки бутун базага нисбатан қўйилиши мумкин.
Блокировкаларни бошқариш билан сервердаги блокировка
менеджери шуғулланади. У транзакцияларни бажарилишини назорат
этади ва конфликтларни бартараф этади. Транзакциия ва
блокировкалар бир бири билан мустахкам боғлиқ тушунча.
Транзакция ACID талаблари қаноатлантирилиши учун маълумотларга
блокланишни тадбиқ қилади. Блокировкасиз бир қанча
транзакциялар битта маълумот устида амалларни бажариши мумкин.

7.

Блокировка
Блокировка
параллел жараёнларни бошқариш учун
қўлланилади.
Бунда
МБ
транзакция
рухсатисиз
тахрирланмайди, яъни транзакция бошқа транзакциялар
мурожаатларини блоклайди. Бу билан наижаси мавхум бўлган
амаллар бажарилиши олди олинади. Блокировкани 2 тури
мавжуд:
Ёзишни блоклаш – транзакция жадвал сатрларини шундай
блоклайди, бунда бошқа транзакияларни жорий сатрлар
устидаги амаллари бекор қилинади;
Ўқишни
блоклаш – транзакция сатрларни шундай
блоклайди, бунда бошқа транзакцияларни жорий сатрларга
ёзиш блокировкаси инкор этилади ва ўқишга блокировкаси
қабул қилинади.

8.

Блокировка
МББТ блокировкалар ёрдамида параллелизм муаммоларини
бартараф этиш имкониятини яратувчи маълумотларга мурожаат
протоколларидан фойдаланади. Бунинг моҳияти қуйидагидан
иборат:
Амал натижаси жадвалдаги сатрни ўқишдан иборат бўлган
транзакция, ушбу сатрни ўқишга блокировка қўйиши шарт;
Сатрдаги маълумотларни модификацияловчи транзакция, ушбу
сатрга ёзишни блоклаши зарур;
Бирор транзакция томонидан сатрга нисбатан талаб этилган
блокировка бошқа аввалдан мавжуд блокировка томонидан
инкор этилса, токи аввалги блокировка бекор қилингунча
жорий транзакция кутиш режимига ўтади.

9.

Блокировка
МБ да маълумотларни параллел қайта ишлаш
муаммоси қуйидагича ечилади, жадвал сатрлари
блокланади ва ушбу сатрларни модификацияловчи
навбатдаги транзакциялар инкор этилади ва кутиш
режимига
ўтказилади.
МБ
бутунлик
хоссасини
таъминлашда
транзакциялар
фойдаланувчиларни
изоляциялашнинг мос бирлиги хисобланади. Ҳақиқатда,
агар ҳар бир МБ билан алоқа ўрнатувчи сеанс
транзакциялар
орқали
ўрнатилса,
у
холда
фойдаланувчининг ҳар бир мурожаати МБ нинг
бутун
холатидан бошланади.

10.

Транзакцияларни бажаришдаги муаммолар
Агар маълумотлар базасини бошқариш тизимида блокировка механизми мавжуд бўлмаса,
бирор маълумотни бир нечта фойдаланувчи томонидан ўқиш ва ўзгартиришда қуйидаги
муаммолар юзага келади:
Охирги ўзгартириш муаммоси (ёки йўқотилган янгилаш) (lost update) юзага
келади, қачонки бир қанча фойдаланувчилар битта сатрни аввалги қийматига
асосланган холда ўзгартирганда, яъни бунда оралиқ маълумотлар қисми йўқотилади;
чунки ҳар бир навбатдаги транзакция олдинги транзакция қийматларини қайта ёзади.
Ушбу холатнинг ечими ўзгаришларни кетма-кет киритиш орқали амалга ошади;
«ифлос" ўқиш муаммоси (dirty read) агар фойдаланувчи маълумотлар мантиқан
тўғри холатига келгунча бир неча марта уларни қайта ишловчи мураккаб амалларни
бажарганда юзага келади. Агар ушбу вақтда бошқа фойдаланувчи жорий маълумотларни
ўқиб олса, у холда мантиқан мос бўлмаган маълумотларни олади. Бундай муаммони ечиш
учун маълумотларни ўқиш амали барча ўзгартириш амалларидан кейин амалга
оширилиши керак.;
Такрорланмайдиган ўқиш муаммоси (non-repeatable read) транзакция битта
маълумотни бир нечта марта ўқиб олганида юзага келади. Биринчи транзакция
бажарилаётганда бошқа транзакция жорий маълумотларни ўзгартириш мумкин ва
шунинг учун биринчи транзакция жорий маълумотларни такрорий ўқишда бутунлик
шарти ёки мантиқий мослиги бузилган маълумотларни ўқиб олади;
Фантомларни ўқиш муаммоси (phantom reads) бирор транзакция маълумотни ўқиб
олганидан кейин ва бу транзакция тугамасидан олдин бошқа транзакция жорий
маълумотни ўзгартирганда ёки ўчирганида юз беради. Бунда жадвалдан ўқиб олинган
қийматлар нотўғри хисобланади.

11.

Транзакцияларни бажаришдаги муаммолар
йўқотилган янгилаш (lost update) — битта блокдаги
маълумот турли транзакциялар томонидан ўзгартирилганда
улардан бири йўқотилади;
«ифлос» ўқиш (dirty read) — транзакциялар томонидан
киритилган ва ўзгартирилган ҳамда охир оқибат инкор
(откат) этиладиган маълумотларни ўқиб олиш;
такрорланмайдиган ўқиш (non-repeatable read) —
жорий транзакция доирасида маълумот қайта ўқилганда
аввалги қиймати ўзгартирилган ёки ўчирилган бўлади;
фантом ўқиш (phantom reads) — битта транзакция
доирасида маълумот қайта ўқилганда олдинги ўқишда
шартга мос бўлсада ўқилмаган маълумотни (янги «фантом»
сатрларни) пайдо бўлиши.

12.

Блокировкалаш даражалари
Юқоридаги муаммоларни ечиш учун стандартда тўртта
блоклаш даражаси. Транзакцияларни блоклаш
даражалари
жорий
транзакция
ўзгартирган
маълумотларни бошқа (рақобатчи) транзакциялар
ўзгартириши мумкин ёки мумкинмаслигини, ҳамда
жорий
транзакция
бошқа
(рақобатчи)
транзакциялар киритган (ва аксинча) ўзгартишларни
кўриши мумкин ёки мумкинмаслигини аниқлайди. Ҳар
бир навбатдаги даража олдинги даража талабларини
қаноатлантиради ва ўзининг (қўшимча) чекловларини
ўрнатади.
Блоклаш даражалари қуйидагилар:
Serializable,
Repeatable Read,
Read Committed,
Read Uncommitted.

13.

Блокировкалаш даражалари
Ҳар бир навбатдаги даража олдинги даража талабларини қаноатлантиради ва
ўзининг (қўшимча) чекловларини ўрнатади:
0 даража – маълумотларни «ифлослашни» тақиқлаш. Бу даража
маълумотларни фақат битта транзакция ўзгартириши мумкинлигини талаб
этади; агар бошқа транзакция шу маълумотларни ўзгартироқчи бўлса , у
биринчи транзакция бажарилишини кутиб туриши зарур;
1 даража – “ифлос" ўқишни тақиқлаш. Агар бирор транзакция ўзгартиришни
бошлаган бўлса бошқа хеч бир транзакция биринчи транзакция тугамагунча
жорий маълумотларни ўқий олмайди;
2 даража – такрорланмайдиган ўқишни тақиқлаш . Агар транзакция
маълумотларни ўқиган бўлса, у холда хеч бир бошқа транзакция жорий
маълумотларни ўзгартиролмайди. Шу тарзда,
жорий маълумотни биринчи
транзакция қайта ўқиганда аввалги холатида ўқиб олади.
3 даража –фантомларни тақиқлаш. Агар бирринчи транзакция маълумотни
ўқиган бўлса бошқа транзакция биринчи транзакция қайта ўқиши мумкин бўлган
янги маълумотни киритиши ёки мавжудларини ўчириши мумкин эмас. Ушбу
бллоклаш даражаси калитлар диапазонини блоклаш орқали амалга оширилади.
Бу блоклаш конкрет сатрларга эмас балки бирор мантиқий шартни
қаноатлантирувчи сатрларга нисбатан қўлланилади.

14.

Транзакцияларни блокировкалаш даражалари
Serializable – бошқа транзакция қайта ишлаётган
маълумотга мурожаат этиш мумкин эмас.
Repeatable Read – янгиланган ёки ўчирилган маълумотга
мурожаат мумкин эмас, бироқ янги киритилган маълумотга
мурожаат мумкин.
Read Committed – қайт этилган маълумотга мурожаат
мумкин.
Read Uncommitted – ихтиёрий янгиланган ва қайд
этилмаган маълумотга мурожаат мумкин.
Snapshot – ҳар бир транзакция маълумотларнинг ўз хусусий
версияси билан ишлайди.
SET TRANSACTION ISOLATION LEVEL
{ READ UNCOMMITTED | READ COMMITTED |
REPEATABLE READ | SNAPSHOT | SERIALIZABLE }

15.

Транзакцияларни блокировкалаш
даражалари ва бутунлик хатоликлари
Блоклаш
даражаси
Сериализуемый
Serializable
Повторяющиеся
операции чтения
Repeatable Read
Зафиксированные
операции чтения
Read Committed
Не зафиксированные
операции чтения
Read Uncommitted
Моментальный
снимок Snapshot
Lost updateйўқотилган
янгилаш
Dirty read«Ифлос» ўқиш
Non-repeatable
readтакроланмайдиг
ан ўқиш
Phantom readФантом ўқиш
Нет
Нет
Нет
Нет
Нет
Нет
Нет
Да
Нет
Нет
Да
Да
Нет
Да
Да
Да
Нет
Нет
Нет
Нет

16.

Транзакцияларни блокировкалаш
даражалари ва бутунлик хатоликлари
Блоклаш даражаси
Сериализуемый
Serializable
Повторяющиеся
операции чтения
Repeatable Read
Зафиксированные
операции чтения Read
Committed
Не зафиксированные
операции чтения Read
Uncommitted
Моментальный снимок
Snapshot
Lost updateйўқотилган
янгилаш
Dirty read«Ифлос»
ўқиш
Нет
Нет
NonPhantom
repeatable
read- Фантом
ўқиш
readтакроланмайд
иган ўқиш
Нет
Нет
Нет
Нет
Нет
Да
Нет
Нет
Да
Да
Нет
Да
Да
Да
Нет
Нет
Нет
Нет

17.

READ UNCOMMITTED –
ихтиёрий янгиланган ва қайд этилмаган маълумотга мурожаат
мумкин. Энг бўш режим.
Ўқиш учун блок ўрнатилмайди
Транзакциялар бошқа транзакциялар томонидан
ўзгартирилган ва қайд қилинмаган сатрларни
ўқийди. Бу қайд этилмаган ўзгаришларни ўқишга
рухсат этади ва «ифлос» ўқиш деб аталади.
Маълумотлар
қийматлари
ўзгартиирилиши
мумкин ва транзакция тугашигача маълумотлар
тўпламида сатрлар пайдо бўлиши ва йўқолиши
мумкин. Бу изоляциялаш даражасининг энг
кичик чекловлисидир.

18.

READ COMMITTED –
қайт этилган маълумотга мурожаат мумкин
Бошқа транзакциялар томонидан ўзгартирилган
ва хали қайд этилмаган («ифлос»)
маълумотларни ўқиш мумкин эмас.
Ўқилган маълумотлар жорий транзакция фаол
бўлганда бошқа транзакциялар томонидан
ўзгартирилиши мумкин, наижада
такрорланмаган ўқиш ёки нотўғри маълумотлар
юзага келади.
Бу режим SQL Server да жимликка кўра
ўрнаилган.

19.

REPEATABLE READ -
янгиланган ёки ўчирилган
маълумотга мурожаат мумкин эмас, бироқ янги киритилган маълумотга мурожаат
мумкин
Бошқа транзакция томонидан ўзгартирилган ва
хали қайд қилинмаган маълумотларни ўқиш
мумкин эмас.
Биргаликдаги блокировкалар барча ўқилган
маълумотларга қўлланилади ва транзакция
тугагунча давом этади. Бу бошқа
транзакцияларга жорий транзакция ўқиб олган
сатрларни ўзгартиришни тақиқлайди.
Бошқа транзакциялар жорий транзакцияни излаш
шартига мос янги сатрларни киритиши. Жорий
транзакция диапазонни қайта ўқиганида янги
«фантом» сатрлар пайдо бўлиши мумкин.
Бу режим MySQL да жимликка кўра ўрнатилган
бўлади

20.

SNAPSHOT
Транзакция бошланишида МБ нусхалаб
олинади. Жорий транзакция ўзидан кейин ишга
тушган бошқа транзакциялар бажарган
ўзгаришларни кўрмайди.
Транзакция томонидан моментдаги тасвирларни
нусхаланиб олиниши бошқа транзакциялар
томонидан ёзишни блокламайди.
Агар транзакция ишга тушгандан кейин бирор
транзакция томонидан ўзгартирилган
маълумотни ёзишга харакат қилса, у холда
уриниш бекор қилинади.

21.

SNAPSHOT
Моментдаги тасвир изоляция даражасини
қўлловчи транзакцияни ишга туширишдан
олдин МБ нинг ALLOW_SNAPSHOT_ISOLATION
параметрини ON холатига ўрнатиш зарур.

22.

SERIALIZABLE –
бошқа транзакция қайта ишлаётган маълумотга мурожаат этиш мумкин
эмас. Энг қатъий режим.
Бошқа транзакция томонидан ўзгартирилган
ва хали қайд этилмаган маълумотларни ўқиш
мумкин эмас.
Бошқа транзакциялар жорий транзакция ўқиб
олган маълумотларни ўзгартиролмайди.
Бошқа транзакциялар жорий транзакцияни
ўқиб олиш шартига мос янги сатрларни жорий
транзакция тугамагунча киритлолмайди.
Жорий транзакция маълумотларни қайта
ўқиганида аввалги маълумотлар тўпламини
ўқиб олади.

23.

SERIALIZABLE
Жорий транзакция ўқиб олинган маълумотлар
дипазони блокировкаси жорий транзакция
тугагунча давом этади.
Параллелизм хусусияти ушбу блоклаш
даражаси паст даражада таъминланганлиги
учун жуда зарур бўлганда қўллаш тавсия
этилади.

24.

Транзакцияларни бошқариш
Транзакцияларни бошқариш деганда реляцион
МББТ да маълумотлар устида бажариладиган
операцияларни бошқариш тушинилади. Биринчи
навбатда INSERT, UPDATE ва DELETE операторларии
бажарилиши назарда тутилади. Масалан, жадвал
яратилгандан кейин (CREATE TABLE оператори)
натижани қайд қилиш шарт эмас: МБ да жадвал
яратиш автоматик қайд этилади. Худди шундай
транзакцияни инкор этиш орқали DROP TABLE
ёрдамида ўчирилган жадвални қайта тиклаш имкони
йўқ.

25.

Транзакцияларни бошқариш
Бирор транзакция таркибидаги командалар муваффақиятли
бажарилганидан кейин маълумотлардаги ўзгаришлар дарров
қайд этилмайди. Транзакцияни тўлақонли тугатиш учун
транзакцияларни бошқариш операторлари мавжуд бўлиб
улар ёрдамида транзакция бажарган ўзгаришларни қайд
этиш ёки инкор этиш мумкин.
Транзакцияларни бошқариш учун қуйидаги командалар
ишлатилади:
COMMIT – ўзгаришларни қайд этиш;
ROLLBACK – ўзгаришларни инкор этиш;
SAVEPOINT – алоғида қайтиш нуқталарини ўрнатиш.

26.

Транзакцияларни амалга ошиш
турлари
(SQL стандарти билан аниқланган)
Яққол
Транзакция боши ва охирини яққол кўрсатиш
талаб этилади.
Автоматик
Ҳар бир команда алоҳида транзакция
сифатида қаралади.
Нояққол
Транзакция биринчи SQLоператордан
бошланади ва транзакция охирини яққол
кўрсатиш билан тугайди.
MySQL Server 3 тасини ҳам қўллаб қувватлайди.

27.

Транзакцион ва блокловчи сўровлар
MySQL транзакцияларни (мижознинг жорий сеанси
доирасида) сўровлар орқали қўллаб қувватлайди:
SET autocommit
START TRANSACTION
COMMIT
ROLLBACK

28.

Транзакцияларни бошқариш операторлари
• SET autocommit
MySQL жимликка кўра AUTOCOMMIT режимида ишлайди.
Бунда агар транзакция нояққол тарзда бошланса ҳар бир
сўров автоматик холда алоҳида транзакция сифатида
бажарилади. AUTOCOMMIT режими қуйидаги ўзгарувчи
ёрдамида ўзгартирилиши мумкин:
mysql> SHOW VARIABLES LIKE 'AUTOCOMMIT';

29.

Транзакцияларни бошқариш операторлари
START TRANSACTION [transaction_characteristic [, transaction_characteristic] ...]
transaction_characteristic: {
WITH CONSISTENT SNAPSHOT
| READ WRITE
| READ ONLY
}
BEGIN [WORK]
COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
SET autocommit = {0 | 1}

30.

Транзакцияларни бошқариш
операторлари:
START TRANSACTION ёки BEGIN – қуйидаги
мақсадларда ишлатилади:
транзакция бошланишини кўрсатиш
Қайси объектлар қамраб олдиниши ва уларни блоклаш
даражаси кўрсатилади (зарур бўлганда).
SAVEPOINT <NAME>
Транзакцияни қисман инкор этишда қайтиш нуқтасини
кўрсатиш.
SAVEPOINT имя_точки_сохранения
RELEASE SAVEPOINT <NAME>
Муваффақиятли бажарилган қайтиш нуқтасини ўчириш

31.

Транзакцияларни бошқариш
операторлари:
COMMIT – оператори вазифаси:
Жорий транзакциянинг барча
ўзгариштишларини доимий шаклга ўтказиш
Жорий транзакциянинг барча сақланган
қайтиш нуқталарини ўчириш
Жорий транзакция қўллаган барча
блокировкаларни бекор қилиш

32.

Транзакцияларни бошқариш
операторлари:
ROLLBACK – вазифаси:
Транзакция бошланишидан ёки сақланган нуқтадан (SAVEPOINT)
кейинги барча ўзгаришларни бекор қилади.
Жорий транзакцияда яратилган барча қайтиш нуқталарини бекор
қилади
Транзакцияни ёпади
Жорий транзакция қўллаган барча блоклашларни бекор қилади
SAVEPOINT identifier
ROLLBACK [WORK] TO [SAVEPOINT] identifier
RELEASE SAVEPOINT identifier

33.

Мисоллар:
BEGIN;
INSERT INTO table1 VALUES (1);
SAVEPOINT my_savepoint;
INSERT INTO table1 VALUES (2);
ROLLBACK TO SAVEPOINT my_savepoint;
INSERT INTO table1 VALUES (3);
COMMIT;
BEGIN;
INSERT INTO table1 VALUES (3);
SAVEPOINT my_savepoint;
INSERT INTO table1 VALUES (4);
RELEASE SAVEPOINT my_savepoint;
COMMIT;

34.

Мисоллар:
START TRANSACTION;
SELECT @A:=SUM(salary) FROM table1 WHERE type=1;
UPDATE table2 SET summary=@A WHERE type=1;
COMMIT;

35.

Взаимоблокировки
Взаимоблокировка возникает тогда, когда две и более транзакции взаимно удерживают и запрашивают
блокировку одних и тех же ресурсов, создавая циклическую зависимость. Такие состояния наблюдаются
и в том случае, если транзакции пытаются заблокировать ресурсы в разном порядке. Они могут
возникнуть, когда несколько транзакций блокируют одни и те же ресурсы. Для примера рассмотрим две
транзакции, обращающиеся к таблице StockPrice:
Транзакция № 1
START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
Транзакция № 2
START TRANSACTION;
UPDATE StockPrice SET high = 20.12 WHERE stock_id = 3 and date = '2002-05-02';
UPDATE StockPrice SET high = 47.20 WHERE stock_id = 4 and date = '2002-05-01';
COMMIT;
Если вам не повезет, то каждая транзакция выполнит свой первый запрос и обновит строку данных,
заблокировав ее. Затем все транзакции попытаются обновить вторую строку, но обнаружат, что та уже
заблокирована. В итоге каждая транзакция будет до бесконечности ожидать окончания другой, пока не
произойдет вмешательство извне, которое снимет взаимоблокировку.

36.

Журнал транзакций
Это системная структура, обеспечивающая восстановление
состояния БД
Восстановление состояния БД требуется
1) при откатах транзакций
- явно (оператор ROLLBACK)
- при аварийном завершении
клиентского приложения
- принудительный откат при
взаимной блокировке
2) при внезапной потери
данных в ОП
3) при отказе HD
- при отключении электропитания
- сбои процессора

37.

Логическая структура журнала транзакций
- это последовательность записей, содержащих следующую
информацию
Порядковый номер
Log Sequence Number (LSN)- последовательно
увеличивающееся значение
Идентификатор
транзакции
Маркирует транзакцию с учетом пользователя
Операция
Выполняемые команды, в т.ч. завершения транзакции
Атрибут
Имя таблицы, имя поля и т.п.
Новое значение
атрибута
Старое значение
атрибута

38.

Пример ведения журнала транзакций
Transaction 1
Transaction 2
Transaction log
10.00
Begin tran
Tr1 Begin tran
10.01
10.02
Update Tab1
Begin tran 2
Tr1 новая …старая …
Tr2 Begin tran
10.05
10.06
Update Tab2
Insert into Tab3
Tr1 новая …старая
Tr2 новая
Insert into Tab4
Tr2 новая
10.10
10.12
Insert into Tab1
10.15
10.16
Insert into Tab2
10.20
10.21
10.23
Commit
Tr1 новая
Delete from Tab5
Insert into Tab4
Commit
Tr1 новая
Tr2 старая …
Tr1 Commit , фиксация
Tr2 новая
Tr2 Commit , фиксация

39.

Журнал транзакций
Общими принципами восстановление состояния БД являются
Результаты зафиксированных транзакция должны быть
сохранены в восстановленном состоянии БД
Результаты незафиксированных транзакция должны быть
отсутствовать в восстановленном состоянии БД

40.

Модели ведения журнала транзакций
- протокол с отложенными изменениями
- протокол с немедленными изменениями

41.

42.

Потерянное обновление
Транзакция №1
Состояние базы данных
Транзакция №2
SELECT comm
comm = . 12
SELECT comm
FROM Salespeople
WHERE snum = 1001;
UPDATE Salespeople
comm = .10
SET comm = . 10
WHERE snum = 1001
COMMIT WORK;
comm = .14
UPDATE Salespeople
SET comm = .14
WHERE snum = 1001;
COMMIT WORK;

43.

• По завершению этой последовательности операторов
значение comm = . 14
• Обновление до . 10 не имело результата.
• Это не обязательно является ли это проблемой,
например установка для comm значения . 14 на
следующей неделе дала бы тот же самых эффект
перекрытия.
• Однако при изменении данных часто учитывается их
предыдущее значение.
• Пользователь, выполнявший Транзакцию №2 был
введет в заблуждение: он думал, что текущие comm = .
12, тогда как они были = . 10
• Если бы он намеревался увеличить комиссионные на .
02, то результат был бы ошибочным.
• Если выполнить увеличение непосредственно,
использую в операторе UPDATE предложение SET comm
= comm + 0.02, то ошибки можно избежать, но это не
всегда легко сделать при сложных вычислениях.

44.

Преждевременное чтение
Транзакция №1
Состояние базы данных
SELECT comm
comm = . 12
Транзакция №2
FROM Salespeople
WHERE snum = 1001;
UPDATE Salespeople
comm = .10
SET comm = . 10
WHERE snum = 1001
SELECT comm
FROM Salespeople
WHERE snum = 1001;
ROLLBACK WORK
comm = .12

45.

• Запрос к транзакции №2 выводит значение,
которое уже исчезло из БД.
• Отмена транзакции №1 эквивалентна тому,
что значение comm никогда не = . 10, но
именно это значение было показано в
транзакции №2.

46.

Неповторяющиеся чтение
Транзакция №1
Состояние базы данных
Транзакция №2
comm = . 12
SELECT comm
FROM Salespeople
WHERE snum = 1001;
UPDATE Salespeople
comm = .10
SET comm = . 10
WHERE snum = 1001
comm = .10
SELECT comm
FROM Salespeople
WHERE snum = 1001;

47.

• В транзакции №2 были получены два
разных ответа на один вопрос, данные
действительно изменились, но иногда
необходимо гарантировать, что данные
останутся постоянными до завершения
транзакции
• Это особенно важно для приложений,
которые выполняют чтение данных из
обротку и сохранение новых значений тем
или иным образом связанных со старыми.
• В токам случае подобная ситуация
представляет проблему.

48.

Фантомная вставка
Транзакция №1
Состояние базы данных
Транзакция №2
SELECT AVG (comm)
FROM Salespeople;
INSERT INTO Salespeople
Добавленная строка для
продавца Иванова
VALUES (1020 ‘Иванов’
‘Москва’, . 15);
SELECT AVG (comm)
FROM Salespeople;

49.

• Поскольку в середине транзакции №2 выполняется
оператор ISERT из транзакции №1 результаты
одинаковых запросов будут отличатся.
• Здесь показан особый случай неповторяющегося
чтения.
• Если вклинивающемся операторам, является INSERT,
a не UPDATE или DELETE, то новая строка не может
быть одной из тех, что выведены предыдущим
запросом.
• Эта новая фантомная строка не существовавшая
раньше.
• На практике различие между фантомными
вставками и другими случаями неповторяющегося
чтения заключается в том, что фантомные вставки
дают более ограниченный эффект.
English     Русский Правила