Spring @Transactional传播效果REQUIRES_NEW?

时间:2012-09-11 13:34:09

标签: spring transactions

我正在做一些测试来了解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));
   }
}

1 个答案:

答案 0 :(得分:4)

它应该无法看到第一种方法所做的任何更改(只要您的隔离级别为READ COMMITTED或更高)。

如果您得到不同的结果,请确保@Transactional实际生效。特别是,请确保不要调用同一个类的另一个@Transactional方法 - 由于基于Spring代理的AOP模型的限制,事务方面仅适用于来自类外部的调用。 / p>

另见: