Spring @Transactional 包装2个方法

4

我是Spring的新手。我在我的dao方法中使用@Transactional注解:

@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)时,它们发生在两个单独的事务中。如何将这两个调用包装在同一个数据库事务中?最好不要以编程方式实现。
谢谢
3个回答

5
在DAO层中放置事务属性是一种不好的做法。此外,我不确定为什么您需要为getById方法设置事务。即使您想使用事务,也需要为save和getById方法指定传播行为为REQUIRES_NEW。

4
@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(...);
}

然而,最好的方法是让“保存”方法返回一个ID,因为在持久化之前很难预先知道Person将拥有哪个ID。


谢谢。getById只是一个例子。 - cherouvim

4
在这种情况下的良好实践是将调用这两个DAO方法的服务方法标记为@Transactional。这个案例在这里清楚地讨论过。这里

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接