|
Тема |
Re: прехвърляне на топката [re: Dakota] |
|
Автор |
salle (един такъв) |
|
Публикувано | 12.12.09 17:39 |
|
|
Всъщност това е и нещото, около което се върти спора ни - чия е отговорността.
Не разбирам защо толкова упорито игнорираш факта, че в твоя пример клиентът изпраща явен COMMIT
Явният COMMIT означава "запази са постоянно промените направени от текущата транзакция". Нищо повече нито по-малко! Дори не казва коя аджеба транзакция се предполага да е текущата.
В момента в който клиентът изпрате явен COMMIT той поема напълно отговорността за правилността на промените.
Правя последен опит да ти демонстрирам доколко е сбъркана твоята логика да очакваш сървърът да се погрижи за всичко без контрол от страна на клиента.
Ще използвам твоя пример
BEGIN;
INSERT INTO test VALUES (1, 'foo');
INSERT INTO test VALUES (2, 'foobar');
COMMIT;
Твоето изискване е резултатът да е или 2 реда или 0 и нищо друго нали така?
Да ама това НЕ Е гарантирано дори и когато сървърът прави неявен ROLLBACK до началото на транзакицята!
Защото може първият INSERT да даде грешка а вторият не и тогава имаме:
BEGIN; -- старт на нова транцакция #1
INSERT INTO test VALUES (1, 'foo');
-- грешка, ROLLBACK до началото на #1
INSERT INTO test VALUES (2, 'foobar');-- неявен старт на нова транзакция #2
-- успешен insert
COMMIT; -- приключи ТЕКУЩАТА транзакция т.е. #2 !!!!
Съдържанието на таблицата е (2, 'foobar')
Няма да намериш никъде никаква логика според която сървърът да откаже да изпълни втория INSERT. Това, че клиентът приема една поредица от оператори за една монолитна транзакция не го освобождава от задължението да провери дали сървърът е изпълнил тази поредица от оператори като една или повече транзакции.
|
| |
|
|
|