Пользователь отправляет запрос на сервер о переводе части средств со своего счета на счет другого пользователя.
На уровне базы данных поле 
balance у каждого пользователя: 
unsignedInteger
Происходит валидация запроса:
$this->validate($request, [
   'receiver_id'=>'required',
   'money'=>'required|integer',
]);
Далее выполняется транзакция:
DB::transaction(function () use ($request) {
    //Снимаем деньги со счета пользователя 
    User::where('id', Auth::user()->id)->decrement('balance', $request->money); 
    //Переводим деньги другому пользователю
    User::where('id', $request->receiver_id)->increment('balance', $request->money);
    //Добавляем в бд запись о транзакции
    $transaction = MoneyTransaction::create($request->all() + ['sender_id' => Auth::user()->id, 'type_id' => 2]);
});
1) Правильно ли организована структура транзакции?
2) Нужно ли проверять, что у пользователя
 достаточное количество денег на счету (больше чем $request->money)  если поле 
balance в базе данных 
unsignedInteger?
3) Если да, то это нужно делать в самой транзакции?
4) И нужно ли использовать какие-либо блокировки 
sharedLock/lockForUpdate?
Заранее спасибо!