Spring 数据 CrudRepository 和交易

Spring Data CrudRepository and Transactions

我正在尝试在 CrudRepository 接口上实现交易。我是这方面的初学者,我目前的问题是,当收到来自不同客户的大量请求时,我有时会收到重复的请求。 为避免这种情况,我想使用 SQL 事务及其在 Spring 中的实现,但我无法使其正常工作。

这是我尝试过的方法:

@Repository
@EnableTransactionManagement
@Transactional
public interface ApplicationPackageDao extends CrudRepository<ApplicationPackage, Long> {

/**
 * Find if a record exists for this package name ,
 * @param packageName
 * @return
 */
@Transactional
ApplicationPackage findByPackageName(String packageName);

}

不过好像不行。 我试图在我正在调用的 Java 方法的前面添加 @Transactionnal 注释,但我也无法让它工作。

我应该如何处理 CrudRepository 上的事务? 还是我用错了?

我的建议:

使用@Configuration 注释检查您的上下文和配置类。来自 documentation:

The @EnableTransactionManagement annotation provides equivalent support if you are using Java based configuration. Simply add the annotation to a @Configuration class

@EnableTransactionManagement and only looks for @Transactional on beans in the same application context they are defined in

那么你甚至可以在你的服务中使用@Transactional 方法

希望对您有所帮助

除了 crm86 的回答之外,还有一些关于 @Transactional 注释的注释:

  • 在您的应用程序中注释入口点似乎是最佳实践(例如,您的 Web 控制器方法或计划批处理的主要方法)。通过使用注释属性 TxType,您可以确保 constraints/conditions 在位于应用程序更深处的方法中(例如,如果没有 trx-context 是 运行,则 TxType.MANDATORY 将抛出,等等)。

  • 只有当 class 被加载为 spring bean 时,@Transactional 注释才有效(例如 class 级别的 @Component 注释)。

  • 记住只有 RuntimeException 导致回滚。如果你想要一个导致回滚的检查异常,你必须使用属性 rollbackOn 枚举每个这样的异常。

  • class 级别的注释对该 class 的所有 public 方法有效。方法级别注释覆盖 class 级别的注释。上面示例中的重复注释(首先在 class 级别,然后在方法级别)无效。