Spring Data CrudRepository和Transactions

Jon*_*gut 6 java spring transactions spring-boot

我正在尝试在CrudRepository接口上实现事务.我是初学者,我目前的问题是,当收到来自不同客户的大量请求时,我有时会得到重复.为了避免这种情况,我想使用SQL Transactions及其在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);

}
Run Code Online (Sandbox Code Playgroud)

但它似乎不起作用.我试图在我正在调用的Java方法中添加@Transactionnal注释,但我也无法使其工作.

我如何处理CrudRepository上的事务?或者我完全使用了错误的东西?

Her*_*eri 8

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

  • 似乎最好的做法是在应用程序中注入入口点(例如,您的Web控制器方法或计划批处理的主要方法).通过使用注释属性TxType,您可以确保在应用程序中更深层次的方法中的约束/条件(例如,如果没有运行trx-context,则抛出TxType.MANDATORY等).

  • 如果将类作为spring bean加载(例如,类级别为@Component注释),则@Transactional注释仅具有效果.

  • 请记住,只有RuntimeException导致回滚.如果要检查导致回滚的已检查异常,则必须使用属性rollbackOn枚举每个此类异常.

  • 类级别的注释对此类的所有公共方法都有效.方法级别注释会覆盖类级别的注释.上例中的重复注释(首先在类级别,然后在方法级别)没有任何效果.


crm*_*m86 3

我的建议是:

使用 @Configuration 注释检查您的上下文和配置类。从文档中:

如果您使用基于 Java 的配置,则 @EnableTransactionManagement 注释提供等效支持。只需将注释添加到 @Configuration 类即可

@EnableTransactionManagement 并且仅在定义它们的同一应用程序上下文中的 bean 上查找 @Transactional

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

希望能帮助到你