Есть ещё вариант, помимо предложенных ранее. Немного экзотический. Но имеет место быть, т.к. сам лично столкнулся с ним, используя вендорское ПО.
Это состояние трансфера в каждый момент времени. Грубо говоря, когда создаётся трансфер, то сразу генерируется запись (в отдельной табличке, например) со статусом это трансфера, например, CREATED. Когда выполняется какое-либо действие, то состояние изменяется (изменяется именно поле статус в записи), например, на LOCKED. И если оно LOCKED, то никакие действия с этим трансфером сделать нельзя. Если же трансфер выполнен успешно, то статус переходит в, например, APPROVED или ACCEPTED. А если в ходе трансфера были ошибки, то он переходит в статус, например, DECLINED.
Как показала практика, то такого решения хватает в 99% случаях.