Прежде всего, управление транзакциями должно осуществляться на уровне обслуживания, а не на уровне DAO, так как это приведет к значительному снижению производительности (для решения проблемы с соответствующим уровнем изоляции транзакций и распространением в каждом отдельном методе). Кроме того, объем единицы работы зависит от уровня обслуживания, а не от уровня доступа к данным: представьте себе выполнение бизнес-процесса, который должен работать с двумя или более DAO.
Существует много дискуссий в Интернете , что точки в этом направлении , как здесь , здесь и здесь .
В любом случае, поскольку это интервью, давайте примем вопрос как есть. С моей точки зрения, вы будете использовать @Transactional
аннотацию (или конфигурацию XML) в обоих методах и с распространением транзакции со REQUIRED
значением. Таким образом, когда любой из этих методов вызывается и если предыдущая транзакция не существует, будет создана новая транзакция:
@Transactional
class MyDAO {
@Transactional(propagation = REQUIRED)
public void foo() {
}
@Transactional(propagation = REQUIRED)
public void bar() {
}
}
foo()
иbar()
делить одну и ту же транзакцию, и если 1 не удастся, другой 1 также откатится? Можете ли вы дать некоторые разъяснения?@Transactional(propagation = REQUIRED)
метод уровня DAO для распространения и@Transactional
на уровень обслуживания, но если я добавлю@Transactional
только уровень обслуживания вместо того, чтобы добавлять на уровень DAO, в чем разница?propagation = REQUIRED
является значением по умолчанию для распространения транзакционной аннотации, поэтому его не обязательно записывать.Игнорирование Spring и Framework в моем ответе ..... просто основная идея использования параметров функции. Я уверен, что концепция может применяться в рамках [вставить рамки здесь].
Вам нужно будет обработать коммит / откат вне 2 методов DAO. 2 метода должны были бы принять транзакцию / соединение в качестве входных данных.
код псевдо:
источник
Tran t
в качестве параметра оба метода. Можете ли вы дать некоторые объяснения?Существует вероятность того, что два метода должны работать независимо друг от друга, и в то же время они могут выполняться в одной и той же транзакции. Поэтому нам нужно использовать Propagation-Required. Если транзакция должна выполняться в той же транзакции, то она будет использовать первую транзакцию, иначе будет создана новая транзакция, если она будет вызвана независимо. Поправь меня, если я ошибаюсь.
источник