Софтуерно Инженерство
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
Alex0101 avatar Alex0101 375 Точки

Подкрепям колега. И на мен ми е по- логично  по описаната от теб последователност. 

0
DonchoPatronski avatar DonchoPatronski 35 Точки

Така. Напълно съм съгласен с теб, така трябва да се прави както казваш.
Трябва ти транзакция когато няколко заявки, инсерти, ъпдейти или каквото и да е, изпълняват едно цяло. Тоест искаш да си сигурен, че цяла последователност от стъпки се е изълнила и нищо по това време не е променило или разрушило данните. Пример за нежелани неща са спиране на тока, едновременно използване от друго място на данните които позваш.
Мисля че, транзакциите ти заключват таблиците които ползваш. Но това трябва да се провери.

Чувал съм даже, че има заключване на ниво редове. Смисъла е за повече бързодействие ако в таблицата ти примерно има милион редове и се ползва често.

 

Някак си в повечето упражнения които правим няма смисъл от транзакциите...

0
15/10/2016 00:22:47
valcho62 avatar valcho62 178 Точки

Как да няма смисъл от транзакции в упражненията ? Първо се научава техниката. Второ - логиката не трябва да е както иска kracheff . Тя е правилна ако става дума за някаква програма, но тук говорим за база от данни. В общия случай, базата данни може да се намира физически на другия край на света, може и да е разпределена между няколко сървъра. Затова е много важно първо да изпълним важната стъпка и после с проверката хем ще проверим бизнес логиката ,хем ще сме сигурни и че всичко технически е минало както трябва .

0
msmilkoff avatar msmilkoff 341 Точки

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

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

0