1

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

1 に答える 1

4

READ COMMITTED最初の方法で行われた変更を確認できないはずです(分離レベルが以上である限り)。

異なる結果が得られた場合は、それが@Transactional実際に有効になっていることを確認してください。特に、同じクラスの別のメソッドを呼び出さないように注意してください@Transactional。SpringプロキシベースのAOPモデルの制限により、トランザクションアスペクトはクラスの外部からの呼び出しにのみ適用されます。

参照:

于 2012-09-11T13:43:22.050 に答える