|
Тема |
Re: така де [re: Dakota] |
|
Автор |
salle (един такъв) |
|
Публикувано | 08.12.09 11:58 |
|
|
В стандартите наистина нещата са описани много абстрактно.
Всъщност колкото повече чета обясненията ти толкова повече се убеждавам, че някак си подхождаш от обратната страна на нещата.
Даваш ли си сметка, че ако SQL беше написан според твоите виждания операторът ROLLBACK нямаше да има право да съществува? А и COMMIT всъщност.
Замисли се над това преди да продължиш да четеш надолу.
очаквам СУБД да прави все пак нещо самичка, най-малкото да знае състоянието на собствената си транзакция, а не аз с външна логика да го определям.
Амииии ... аз пък (и повечето DBA които познавам) категорично не желая СУБД да си решава какво да прави.
По отношение на Атомарността ти явно си "по-католик от папата"
Практиката (и то осмелявам се да твърдя общоприетата) e да се преценява на ниво приложение коя грешка е критична и коя не и само при критични грешки да се връща всичко в изходно положение. Ако не друго може грешката да е временна и да бъде оправена с просто повтаряне на оператора вместа да се прави rollback на потенциално огромно количество данни.
Та, тук общо взето спорът се свежда до следното - какво точно означава командата commit?
И чия е отговорността?
За мен пускането на commit е равносилно на това да кажа на базата следното: "Виж сега, бях ти пуснал няколко команди в транзакция и искам сега да се опиташ да я завършиш успешно!"
Ето тук правиш огромна грешка! Ти разглеждаш многоредовата транзакция като нещо монолитно което пускаш и забравяш (сървъра да се оправя ако може) и отказваш да приемеш, че всъщност става въпрос за интерактивен процес.
Та оттам
какво точно означава командата commit?
Пишейки COMMIT поемаш цялата отговорност, че нещата са наред!
Ако си стигнал до момента в който изпращаш COMMIT това означава, че транзакцията все още е активна т.е. сървърът не е намерил причина за неявен ROLLBACK и си стигнал до точката в която казваш:
"Виж сега това дето го правихме дотук ред по ред според мен (клиентът) е OK, и затова го запази всичко като постоянно"
пишейки commit, базата не трябва да ми позволява да го правя, защото това противоречи на самата концепция за транзакция.
Категорично не си прав!
Няма как сървърът да ти откаже COMMIT. Ако нещо не е било наред с транзакцията сървърът вече е направил неявен ROLLBACK и твоят COMMIT вече се явява в контекста на следваща транзакция.
Точно затова съществуват два оператора за явно приключване на транзакция: COMMIT и ROLLBACK.
Тази двойка оператори дава на клиента контрол върху транзакцията и възможността за преценка дали наистина да се приеме една транзакция, която сървърът вече е сметнал за "добра".
Ако SQL беше изграден по твоята логика то и двата оператора COMMIT и ROLLBACK нямаше да съществуват.
Щеше да има START .... END -> черна кутия в която само сървърът еднолично решава какво да се случи.
|
| |
|
|
|