我试图在CrudRepository接口上实现事务。我是这个的初学者,我目前的问题是,当收到来自不同客户的大量请求时,我有时会得到重复。 为了避免这种情况,我想在Spring中使用SQL Transactions及其实现,但我无法使其正常工作。
以下是我尝试过的方法:
@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上的事务? 或者我完全使用了错误的东西?
答案 0 :(得分:8)
除了crm86之外,还回答了@Transactional注释的一些注释:
似乎最佳做法是在应用程序中注入入口点(例如,您的Web控制器方法或计划批次的主要方法)。通过使用注释属性TxType,您可以确保在应用程序中更深处的方法中的约束/条件(例如,如果没有运行trx-context,则抛出TxType.MANDATORY等。)
如果将类作为spring bean加载(例如,类级别为@Component注释),则@Transactional注释只有一个效果。
请记住,只有RuntimeException会导致回滚。如果您想要一个导致回滚的已检查异常,则必须使用属性rollbackOn枚举每个此类异常。
类级别的注释对此类的所有公共方法都有效。方法级别注释会覆盖类级别的注释。上面示例中的重复注释(首先在类级别,然后在方法级别)没有任何效果。
答案 1 :(得分:2)
我建议:
使用@Configuration批注检查上下文和配置类。来自documentation:
@EnableTransactionManagement注释提供了等价物 如果您使用的是基于Java的配置,则支持。只需添加 注释到@Configuration类
@EnableTransactionManagement只看 对于相同应用程序上下文中的bean的@Transactional 在
中定义
然后即使在方法
中也可以在服务中使用@Transactional希望有所帮助