use try/catch to better handle transaction

Rename previous save() API to protected _doSave() method.
create new save() method for transaction handling.