Недавно делал похожую систему.
Баланс пользователя хранится отдельно, там фиксируется актуальное «реальное» число условных единиц.
Есть таблица транзакций, с описанием, датой, суммой, направлением списания (на баланс или с баланса), поле «заморозка» и поле «статус».
Соответственно, на клиенте показывается реальное число, показывается, исходя из списка транзакций, сколько денег на счету заморожено (такие транзакции, как правило, лежат с состоянием «на проверке» и галочкой в поле «заморозка» до тех пор, пока их не подтвердят, тогда галочка снимается, и замороженная снимается со счета).
В принципе, вполне хватает для всех нужд. Как только транзакция проводится, ее статус меняется на «исполнена», и деньги вычитаются уже из таблички пользователей.