Spring 如何从一个服务调用@Transactional方法从另一个服务调用@Transactional方法从另一个服务调用@Transactional方法

Spring 如何从一个服务调用@Transactional方法从另一个服务调用@Transactional方法从另一个服务调用@Transactional方法,spring,transactions,spring-transactions,Spring,Transactions,Spring Transactions,我有: 1) 服务: 2) 服务: 如何实施工作“保存”方法? 我应该怎么做才能将项目保存在line analyzerDao.save(项目)中,而不仅仅是在第一个事务完成之后?在提交事务之前,数据不会显示在数据库中。对于@Transactional方法,事务在从方法返回后由Spring提交 顺便说一句,私有方法上的@Transactional没有效果,因此Scanner.scan()根本不是事务性的。您需要的是一个新事务,只保存您需要保存的内容。您可以通过将@Transactional注释的传

我有:

1) 服务:

2) 服务:

如何实施工作“保存”方法?
我应该怎么做才能将项目保存在line analyzerDao.save(项目)中,而不仅仅是在第一个事务完成之后?

在提交事务之前,数据不会显示在数据库中。对于
@Transactional
方法,事务在从方法返回后由Spring提交


顺便说一句,私有方法上的
@Transactional
没有效果,因此
Scanner.scan()
根本不是事务性的。

您需要的是一个新事务,只保存您需要保存的内容。您可以通过将
@Transactional
注释的
传播
配置为
REQUIRES\u NEW
来实现这一点

不幸的是,您的案例有点棘手,因为在执行
保存(项目)时,您正在调用
上下文中的方法,这意味着事务拦截器将不会拦截此类调用,因此您可以将服务注入其自身保留的字段,并在注入的服务上调用它,而不是强制事务拦截器拦截对该方法的调用,请尝试以下实现:

@Service
public class DefaultAnalyzerService implements AnalyzerService {
    @Inject
    AnalyzerDao analyzerDao;
    @Inject
    AnalyzerService analyserService;

    @Transactional
    @Override
    public void analyze() {
        List<AnalyzerResult> items;
        // code filling items list removed;
        analyserService.save(items); 
    }

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    @Override
    public void save(List<SomeType> items) {
        analyzerDao.save(items); // <--- Why after call save items are not saved in DB?
    }

}
@服务
公共类DefaultAnalyzerService实现AnalyzerService{
@注入
AnalyzerDao AnalyzerDao;
@注入
AnalyzerService AnalyzerService;
@交易的
@凌驾
公共空间分析(){
名单

@Service
public class AnalyzerService
{
    @Inject
    AnalyzerDao analyzerDao;

    @Transactional
    public void analyze() {
        List<AnalyzerResult> items;
        // code filling items list removed;
        save(items); 
    }

    @Transactional
    private void save(List<SomeType> items) {
        analyzerDao.save(items); // <--- Why after call save items are not saved in DB?
    }
}
@Repository
public class AnalyzerDao extends GenericDaoImpl<AnalyzerResult>
{
    //all needed methods for find, edit, delete and save which works fine in other cases.
}
Caused by: org.springframework.transaction.TransactionSystemException: Could not commit Hibernate transaction; nested exception is org.hibernate.TransactionException: Transaction not successfully started
    at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:660)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:393)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:120)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
    at com.sun.proxy.$Proxy44.execute(Unknown Source)
    at org.quartz.core.JobRunShell.run(JobRunShell.java:223)
    ... 1 more
Caused by: org.hibernate.TransactionException: Transaction not successfully started
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:127)
    at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:656)
    ... 9 more
@Service
public class DefaultAnalyzerService implements AnalyzerService {
    @Inject
    AnalyzerDao analyzerDao;
    @Inject
    AnalyzerService analyserService;

    @Transactional
    @Override
    public void analyze() {
        List<AnalyzerResult> items;
        // code filling items list removed;
        analyserService.save(items); 
    }

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    @Override
    public void save(List<SomeType> items) {
        analyzerDao.save(items); // <--- Why after call save items are not saved in DB?
    }

}