Ясно е, че ако не си започнал експлицитно транзакцията, тя ще бъде стартирана имплицитно. В този случай всяка инструкция става отделна транзакция, това е ОК. Но, както гласи и текстът, който си цитирал, приключването на транзакцията е експлицитно, т.е. не може след като аз съм започнал транзакцията с експлицитен оператор, сървърът да я завършва имплицитно без мое разрешение.
Това, че е в рамките на транзакцията е настъпила грешка, не означава, че тя вече не съществува! Не и докато аз експлицитно не съм го указал!
Какво очаквам?
Това, с което и започнах, а именно - транзакциите да бъдат атомарни.
Това условие в посочения от мен пример не е изпълнено.
Съответно, съгласявам се с твоята гледна точка и приемам, че в MySQL и Oracle, отговорността за това е на клиента, а не на сървъра. След като така са решили разработчиците на тези две СУБД, нека бъде така. Стискаме си ръцете.
Аз, от своя страна, предпочитам (когато мога) да използвам база от данни, в която сървърът гарантира, че транзакциите са атомарни и не прави rollback до savepoint зад гърба ми - PostgreSQL:
db=# BEGIN;
BEGIN
db=*# INSERT INTO test VALUES (1, 'foo');
INSERT 0 1
db=*# INSERT INTO test VALUES (2, 'foobar');
ERROR: value too long for type character varying(5)
db=!# INSERT INTO test VALUES (3, 'bar');
ERROR: current transaction is aborted, commands ignored until end of transaction block
db=!# COMMIT;
ROLLBACK
db=# SELECT * FROM test;
id | name
----+------
(0 rows)
"Договор, подписан с Русия, струва по-малко от хартията, върху която е написан!" - Бисмарк
|