![](/img/trans.png)
[英]Is it possible to mark one method of an entire @Transactional class as non-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();
}
}
@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.