Spring Data CrudRepository和Transactions

时间:2015-04-14 07:48:39

标签: java spring transactions spring-boot

我试图在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上的事务? 或者我完全使用了错误的东西?

2 个答案:

答案 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

希望有所帮助