簡體   English   中英

@Transactional 僅在一種方法上

[英]@Transactional only on one method

我需要創建一個具有模式列表的@Scheduled 方法,並且對於每個模式,從 2 個表中刪除行。

    @Scheduled(fixedDelay = 10000)
public void scheduleFixedDelayTask() {
    List<String> presentSchemas = getPresentSchemas();
    for (String schema : presentSchemas) {
        deleteFromCustomerTables(schema);
    }
}

我已將 deleteFromCustomerTables 定義為 @Transactional(propagation = Propagation.REQUIRES_NEW) 並在其中使用 EntityManager 從 2 個表中刪除行。

為了使其工作,我需要將@Transactional 添加到 scheduleFixedDelayTask,否則我會收到 TransactionRequiredException。

我的問題是我不希望整個調度程序成為@Transactional,如果一個模式出現問題,我不想回滾所有模式。

我也嘗試過不使用 @Transactional 並使用:

    Session session = entityManager.unwrap(Session.class);
    Transaction t = session.beginTransaction();
    //exec delete
    t.commit();
    session.close();

但我仍然收到 TransactionRequiredException。 你有解決方案嗎?

  • 您必須確保您配置了事務管理器,如下所示:
@Configuration
@EnableTransactionManagement
public class TransactionConfig {

  @Bean
  @Primary
  public PlatformTransactionManager transactionManager() {
    return new JpaTransactionManager();
  }
}
  • 您必須確保方法 deleteFromCustomerTables 不在同一個組件中,如下所示:
@Component
class Component1 {
   void scheduleFixedDelayTask(){...}
}

@Component
class Component2 {
   void deleteFromCustomerTables(){...}
}
 

但在非常高的級別上,Spring 為在 class 本身或成員上聲明 @Transactional 的類創建代理。 代理在運行時大部分是不可見的。 它為 Spring 提供了一種在方法調用之前、之后或周圍將行為注入被代理的 object 的方法。 事務管理只是可以掛鈎的行為的一個例子。安全檢查是另一個例子。 你也可以提供你自己的,比如日志記錄。 因此,當您使用 @Transactional 注釋方法時,Spring 會動態創建一個代理,該代理實現與您正在注釋的 class 相同的接口。 當客戶端調用您的 object 時,調用會被攔截並通過代理機制注入行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM