我正在做一些测试来了解Spring 3中@Transactional的行为。虽然,它没有像我期望的那样工作。如果有一个方法使用Propagation.REQUIRED使用Propagation.REQUIRES_NEW调用另一个方法,第二个方法是否能够从DB检索第一个方法插入的数据?
EDITED: 我 AM 看到@Transaction中的未提交更改,这是我的(讨厌的)代码。
@Service
public class FeedManager {
@Autowired
JdbcTemplate jdbcTemplate;
@Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRED)
public boolean createFeed(Feed feed, boolean anonymizeIt) {
String query = "INSERT INTO feed (name, url, is_active) values (?, ?, ?)";
int rowsAffected = jdbcTemplate.update(query, feed.getName(), feed.getUrl(), feed.isActive());
boolean success = (rowsAffected == 1);
if (anonymizeIt) {
success = success && this.anonymizeFeedName(feed);
}
return success;
}
@Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRES_NEW)
public boolean anonymizeFeedName(Feed feed) {
String query = "UPDATE feed set name = ? where name = ?";
int rowsAffected = jdbcTemplate.update(query, feed.getName() + (new Date()).toString(), feed.getName());
boolean success = (rowsAffected == 1);
return success;
}
}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:mrpomario/springcore/jdbc/jdbc-testenv-config.xml")
public class TransactionalTest {
@Autowired
FeedManager feedManager;
Feed feed;
@Before
public void setup() {
feed = new Feed("RSS", "http://www.feedlink.com", true);
}
@Test
public void test_Create() {
assertTrue(feedManager.createFeed(feed, false));
}
@Test
public void test_Anonymize() {
assertTrue(feedManager.anonymizeFeedName(feed));
}
@Test
public void test_Create_And_Anonymize() {
Feed feedo = new Feed("AnotherRSS", "http://www.anotherfeedlink.com", true);
assertTrue(feedManager.createFeed(feedo, true));
}
}
答案 0 :(得分:4)
它应该无法看到第一种方法所做的任何更改(只要您的隔离级别为READ COMMITTED
或更高)。
如果您得到不同的结果,请确保@Transactional
实际生效。特别是,请确保不要调用同一个类的另一个@Transactional
方法 - 由于基于Spring代理的AOP模型的限制,事务方面仅适用于来自类外部的调用。 / p>
另见: