By default, when the Activiti engines encounters an exception, it will rollback to the last known stable state, which is always a wait state (eg a user task).
Your problem could be fixed using async continuations: that way you introduce an wait state in your process, that commits all data to the DB, and then continues execution. However, we haven't implemented this not yet as core functionality in the engine.
A 'workaround' which I've seen on the forum - altough a not so clean one, is to add a timer event in your process with a ridicolous small time. When process executions arrives at the timer, it commits all data to the DB, and then executes the process further when the timer fires.