Добре аз нещо не мога да разбера. В първия ти пример на Postgres-а
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)
... втория INSERT не се ли прави ROLLBACK до имплицитен SAVEPOINT преди него без да си "насочил пистолета" в тази посока?! В смисъл ако направя COMMIT след него нищо няма да влезе в test, нищо като (2, NULL) примерно. Последното би било пример за нарушена атомарност.
Не знам защо реши че Postgres-а е "по-атомарен" от MySQL в случая. Напротив, единствено е по-неудобен, щото трябва да му раздувам SAVEPOINT-и за да ме остави да се recover-на от грешката.
Относно SEH (изцепшъни) повечето бази го имат (за MySQL не знам), почти навсякъде е извращение извън стандарта, който не знам да го специфицира.