Софтуерно Инженерство
Loading...
kracheff avatar kracheff 11 Точки

Databases Basics - Transactions - общ въпрос

Колеги,

Бихте ли коментирали защо в базите данни е необходимо да има Rollback и Commit? Не е ли по-лесно да се направи проверката преди да се изпълни съответната DML команда?

Пример от упражненията - теглене на пари от банковата сметка. Стартираме транзакция, която ъпдейтва баланса в сметката. Проверяваме дали има наличност. Ако няма, правим rollback, ако има, commit. Не е ли по-логично да е обратния процес - първо проверяваме дали има наличност и чак тогава изпълняваме ъпдейта.

Или пък примера в презентацията - инсърт-ваме проект на служителя и чак тогава гледаме, дали не са станали 3 проектите. Ако да, rollback, else commit. Вместо например ПЪРВО да проверим служителя колко проекта има и ако не са му много, чак тогава да му инсеърт-нем нов. 

Не е ли по-лесно проверката да се прави преди манипулацията на данните? Или може би обяснението е в това, че операциите се записват в системни таблици като например deleted & inserted?

Ще съм благодарен за малко повече обяснение по темата.

Тагове:
0
C# DB Fundamentals 14/10/2016 16:50:01
msmilkoff avatar msmilkoff 341 Точки

Транзакциите са нужни за да се гарантира атомарност, т.е. да не се изпълнява частично дадена заявка, а ако нещо не мине - цялата база да се върне към предишното състояние на консистентност. Например, при трансфер на пари от сметка А към сметка Б, се състоят две операции - теглене от А и "наливане" в Б. Ако правиш някаква предварителна проверка, може да мине при А и да не мине при Б. Това пък от своя страна, ако е обвързано с тригери например, може да резултира в промени по още 15 таблици, където не си правил изрични проверки. Един ROLLBACK гарантира, че ако нещо се обърка в една операция, то и двете няма да бъдат изпълнени, което предотвратява създаване или изгубване на пари.

   Ако си спомняш от лекцията, имаше пример, че транзакциите са подобни на checkpoint-ите в игрите, та и аз измилих една      (не толкова добра) метафора, свързана с въпроса ти laugh
Представи си следния сценарии: играш някаква игра и си на 1% кръв, след което някой те гръмне.
 Кое има повече логика?
 - да умреш и да се върнеш на последния сейв или
 - да направиш проверка: ако си на 1% кръв и някой реши да те гръмне - да не те гърми.

0