1. получаем баланс пользователя из базы
2. проверяем хватает ли средств для перевода по полученному балансу в пункте 1
3. обновляем значения у одного пользователя и другого в базе
Вообще-то эти действия при желании выполняются одним атомарным запросом UPDATE ... JOIN ... WHERE.
После которого можно проверить, сколько строк изменил запрос - и либо сохранить информацию об успешно совершенной транзакции (у вас же не только сумма на счетах меняется, правда?), либо вернуть ответ о невозможности перевода.