Чтобы понять работу транзакций Spring, я хочу знать, что происходит в следующем случае, когда один метод, помеченный как @Transactional
, вызывает другой метод, помеченный как @Transactional
.
Предположим, что в конфигурации используются все настройки по умолчанию.
@Service("myService")
@Transactional
public MyService{
public void myServiceMethod(){
myDAO.getSomeDBObjects();
}
}
@Repository("myDAO")
@Transactional
public MyDAOWithUsesBeyondMyService{
public void getSomeDBObjects(){...}
}
Теперь, если я должен был ввести MyService.myServiceMethod()
, он явно начал бы транзакцию. Затем, после сверления в myDAO.getSomeDBObjects()
, что произойдет? Был ли факт, что транзакция уже существует, не вызывает никакой новой транзакции или я создаю здесь две транзакции?
Документация (цитируется ниже) о распространении, кажется, охватывает это, но я хотел бы подтвердить свое понимание, это было немного для моего девственного мозга, чтобы понять все сразу.
Распространение. Как правило, весь код выполняется в пределах транзакции будет выполняться в этой транзакции. Однако, у вас есть возможность указать поведения в случае, если транзакционный метод выполняется, когда контекст транзакции уже существует. Например, код может продолжать работать в существующей транзакции ( общий случай); или существующих транзакция может быть приостановлена, а новая транзакция создана. Spring предлагает все вариантов распространения транзакций знакомый с EJB CMT. Чтобы прочитать о семантика транзакции распространение в Spring, см. раздел 10.5.7, "Распространение транзакций".