Spring 忽略 @Transactional 注释

Posted

技术标签:

【中文标题】Spring 忽略 @Transactional 注释【英文标题】:Spring ignores @Transactional annotations 【发布时间】:2017-09-11 11:39:26 【问题描述】:

似乎 spring 忽略了服务类上的 @Transactional 注释。 我读了一些q&a on SO 和blogs,但似乎没有一个选项适合我。

    我没有调用私有方法 - 我调用的是在接口上公开的公共方法。 我正在调用不同类的方法(即不是从同一个类调用)。 我的“服务”类使用@Component@Transactional 进行注释。 我的“服务类有一个接口,我正在使用该接口和@Inject 注释注入它。 我尝试添加proxy-target-class="true",如其​​中一个答案中所述 - 没有用。 我使用的是 JAX-RS(不是 spring-mvc)。

当我收到此异常时,错误发生在 DAO 层上,并带有 @Transactional(propagation = Propagation.MANDATORY) 注释:

org.springframework.transaction.IllegalTransactionStateException: No existing transaction found for transaction marked with propagation 'mandatory'

下面是一些代表所涉及的类和接口的通用代码:

public interface IService<T extends BaseEntity> 
    void save(T entity);


public abstract class AbstractService<T extends BaseEntity> implements IService<T> 

    @Inject
    private IDao dao;

    @Override
    public void save(T entity) 
        dao.save(entity);
    


public interface IPersonService extends IService<PersonEntity> 
        void saveAll(List<PersonEntity> persons);


@Component
@Transactional
public class PersonService extends AbstractService<PersonEntity> implements IPersonService 

    @Override
    public void saveAll(List<PersonEntity> persons) 
        for (PersonEntity person : persons) 
            super.save(person);
        
    


@Component
public class PersonApi 

    @Inject
    private IPersonService personService;

    public void saveAll(...) 
        ...
        personService.saveAll(persons);
    

有什么想法或建议吗?

【问题讨论】:

如果你在同一个类上调用一个方法,这些都不重要。 AOP 仅适用于外部方法调用,而不适用于内部方法调用。但是,由于您尚未添加代码,因此无法查看错误在哪里。 是什么让您认为它不起作用?你能分享一些代码吗? 我没有从同一个类中调用该方法。正如我所说,我正在使用它的接口注入服务,并使用接口调用它。我正在努力提供一些代码示例... 【参考方案1】:

所以事实证明我还必须用@Transactional 注释抽象类,否则它将不起作用。 Spring 文档只讨论接口。 由于我这里调用的是抽象类方法,所以也需要@Transactional。

@Transactional
public abstract class AbstractService<T extends BaseEntity> implements IService<T> 

    @Inject
    private IDao dao;

    @Override
    public void save(T entity) 
        dao.save(entity);
    



【讨论】:

以上是关于Spring 忽略 @Transactional 注释的主要内容,如果未能解决你的问题,请参考以下文章

具有@async超时值的Spring @transactional不起作用

Grails @Transactional 与 Spring @Transactional 注释之间的差异

Spring - @Transactional - 在后台发生了啥?

Spring @Transactional 和 Spring @Lock 注解有啥关系?

Spring @Transactional 使用

Spring @Transactional 只读传播