Spring @Transactional упаковка 2 метода - PullRequest
4 голосов
/ 18 августа 2010

Я новичок весны. Я использую аннотацию @Transactional для своих методов dao:

@Transactional
public Person getById(long id) {
    return new Person(jdbcTemplate.queryForMap(...));
}

@Transactional
public void save(Person person) {
    jdbcTemplate.update(...);
}

и я настроил менеджер транзакций так:

<tx:annotation-driven transaction-manager="txManager" />
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>

Проблема в том, что когда мой клиентский код вызывает dao.save(..), а затем dao.getById(4), это происходит в двух отдельных транзакциях Как можно обернуть эти 2 вызова в одной транзакции базы данных? В идеале, не делая это программным способом.

спасибо

Ответы [ 3 ]

5 голосов
/ 18 августа 2010

Не рекомендуется помещать транзакционные атрибуты в слой DAO.Также я не уверен, зачем вам транзакция для метода getById.Даже если вы хотите использовать транзакцию, вам нужно указать поведение распространения как REQUIRES_NEW для метода сохранения и getById.

4 голосов
/ 18 августа 2010
@Transactional(propagation = REQUIRES_NEW, readOnly = false)
public Person saveAndGetById(Person person, long id) {
    save(person);
    return getById(id);
}

@Transactional(propagation = REQUIRED)
public Person getById(long id) {
    return new Person(jdbcTemplate.queryForMap(...));
}

@Transactional(propagation = REQUIRED, readOnly = false)
public void save(Person person) {
    jdbcTemplate.update(...);
}

Однако лучше всего было бы, чтобы метод «save» возвращал идентификатор, потому что заранее сложно определить, какой идентификатор у человека будет сохранен.

4 голосов
/ 18 августа 2010

Хорошей практикой в ​​этом случае будет пометка метода обслуживания, который вызывает оба этих метода DAO как @Transactional. Дело было четко обсуждено здесь .

...