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 级别,然后在方法级别)无效。
我正在尝试在 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 级别,然后在方法级别)无效。