a) no
b) if it is erroring out at the db_1row call then calling db_abort_transaction should work
btw the following returns "Caught" with tcl 8.4 under nsd 4 beta...
db_transaction {
db_1row test "select 1 from users where user_id = -100"
} on_error {
ns_return 200 text/html "Caught"
}
ns_return 200 text/html "asfd"
so if nsd 4 (or 3.5) is an option that is probably your best bet. Unless db_transaction {} works find for this simple test but doesn't for a more complex series of statements.