always do DB xaction before non-DB xaction to allow rollback