There is another option, in addition to the previously proposed. A bit exotic. But is the place to be, because he has personally faced with it using vendor SOFTWARE.
This state of the transfer at each moment of time. Roughly speaking, when you create a transfer, it immediately generates a record (in a separate plate, for example) with the status of this transfer, for example, CREATED. When performing any action, the status will be changed (it changes the status field in the record), for example, LOCKED. And if it's LOCKED, then no action with this transfer can be done. If the transfer completed successfully, the status enters, for example, APPROVED or ACCEPTED. And if the transfer was error, it goes to the status, for example, DECLINED.
As shown, it is this decision lacking in 99% of cases.