Spring 3 での @Transactional の動作を理解するためにいくつかのテストを行っていますが、期待どおりに動作していません。Propagation.REQUIRED を持つメソッドが Propagation.REQUIRES_NEW を持つ別のメソッドを呼び出す場合、2 番目のメソッドは最初のメソッドによって挿入されたデータを DB から取得できますか?
編集済み: @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));
}
}