当前位置: 首页 > 知识库问答 >
问题:

Spring@Transactional REQUIRES_NEW的繁殖效果?

黎玺
2023-03-14

我正在做一些测试来理解@Transactional在Spring 3中的行为。虽然,它没有像我预期的那样工作。如果有一个方法Propagation.REQUIRED调用另一个方法Propagation.REQUIRES_NEW,第二个方法是否能够从数据库中检索第一个方法插入的数据?

编辑:我在@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个答案

梁丘柏
2023-03-14

它应该无法看到第一个方法所做的任何更改(只要隔离级别为<code>READ-COMMITTED

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

另见:

  • 7.6.1了解AOP代理
 类似资料:
  • 我试图创建一个游戏,敌人将随机产卵,并向屏幕上的一个点移动。我的问题是程序等待它们产卵,然后它们开始移动它们。我希望它们在产卵时开始移动,并在每个产卵之间有一个短暂的Rest。 下面是让它们移动的两个主要方法: Spek是一个简单的类,它扩展了ImageView,setRandomRegion()在屏幕边界上选择一个随机的x,y坐标。为了简单起见,我在while循环中有一个计数器,但我希望最终将其

  • 我自己找到了一种从熊猫数据帧中删除nan行的方法。给定一个包含nan值的列为的数据帧,是否有更优雅的方法来删除列中包含nan值的每一行?

  • 我对改装《我的世界》是新手,我想知道如何改变暴民产卵率。例如,假设我们想产生大量的Enderman。 到目前为止,我已经在: 这意味着在大多数生物群落中,尽管很少产卵(10是体重,爬行动物和蜘蛛有100)。 我知道这个然后被到,等。我的结论是,我需要改变生物群落以改变产卵率。 我可以使用或。我在这里看到两种方法: 完全替换生物群落图。不幸的是,它的方法是,因此我无法添加新的生物群落来取代现有的生物

  • 前言 在 [第11章]() 时我们已经介绍了用 Apriori 算法发现 频繁项集 与 关联规则。本章将继续关注发现 频繁项集 这一任务,并使用 FP-growth 算法更有效的挖掘 频繁项集。 FP-growth 算法简介 一种非常好的发现频繁项集算法。 基于Apriori算法构建,但是数据结构不同,使用叫做 FP树 的数据结构结构来存储集合。下面我们会介绍这种数据结构。 FP-growth 算

  • 我最近把我的应用上传到了谷歌Playstore。我使用错误报告器跟踪崩溃。应用程序工作正常,但经常出现HttpHostConnectException。在进行每次网络通话之前,我都会检查互联网连接。造成这一例外的原因还有其他原因吗?如何避免? 附言:在测试/调试我的应用程序时,我从来没有遇到过这个异常。

  • 我使用的是spring batch,我想写一份工作,在那里我有一个JPA阅读器,可以从数据库中选择分页的产品集。然后我有一个处理器,它将对每个产品执行一些操作(比如对产品),但对产品执行此操作时,项目处理器也将处理其他一些产品(如产品、产品,等等)。然后处理器将进入product,因为它是由读者给出的。但它已经被处理过了,所以再次处理它实际上是浪费时间/资源。人们应该如何解决这个问题——sprin