Ребят, а в jdbc autoCommit(true [def]/false) устанавливается только в рамках внешнего коннекта и не учитывается для вложенных?
Подробнее:
На примере банковской системы:
- 1. В DAO классе есть getCardByID(Long ID), который получает с БД объект класса Card.
- 2. Также в этом же DAO есть transfer(Card c1, Card c2, BigDecimal amount), который выполняет перевод денег с карты c1 на карту c2.
Для перевода денег в рамках одной транзакции должны быть выполнены проверки: карта принимающего должна существовать в системе, денег на счету отправляющего >= переводимой сумме.
По принципу DRY мне не следует внутри транзакции метода transfer заново описывать получение карты, а использовать готовый getCardByID
Суть проблемы:
Но останется ли тогда транзакция, выполняемая в рамках transfer(...) атомарной и согласованной? т.е. будет ли выполнятся блокировка ресурсов во время использования getCardByID внутри transfer() и вовремя выполнения самого transfer() для избегания феномена неповторяемого чтения (например, я считаю сколько денег на карте c1, начну перевод на c2 и в этот же момент владелец c1 снимет все деньги до 0)?