美文网首页
Spring事务失效的8大原因

Spring事务失效的8大原因

作者: AC编程 | 来源:发表于2022-04-22 11:03 被阅读0次

一、异常被吃了

把异常吃了,然后又不抛出来,事务不会回滚。

@Service
public class OrderServiceImpl implements OrderService {

    @Transactional
    public void updateOrder(Order order) {
        try {
            // update order
        } catch {

        }
    }

}

二、异常类型错误

@Service
public class OrderServiceImpl implements OrderService {

    @Transactional
    public void updateOrder(Order order) {
        try {
            // update order
        } catch {
            throw new Exception("更新错误");
        }
    }
}

这样事务也是不生效的,因为默认回滚的是:RuntimeException,如果你想触发其他异常的回滚,需要在注解上配置一下,如:

@Transactional(rollbackFor = Exception.class)

三、方法不是public的

@Transactional只能用于public的方法上,否则事务不会失效,如果要用在非public方法上,可以开启AspectJ代理模式。

四、数据库引擎不支持事务

MyISAM引擎是不支持事务操作,InnoDB才是支持事务的引擎。

五、没有被Spring管理

没写@Service、@Component等注解

六、自身调用问题

update方法上面没有加@Transactional注解,调用有@Transactional注解的updateOrder方法,事务失效。需要在update方法上加@Transactional注解,updateOrder方法可以不用加。

@Service
public class OrderServiceImpl implements OrderService {

    @Transactional
    public void update(Order order) {
        updateOrder(order);
    }

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void updateOrder(Order order) {
        // update order
    }

}

七、数据源没有配置事务管理器

@Bean
public PlatformTransactionManager transactionManager(DataSource dataSource) {
    return new DataSourceTransactionManager(dataSource);
}

八、不支持事务

@Transactional(propagation = Propagation.NOT_SUPPORTED)

相关文章

网友评论

      本文标题:Spring事务失效的8大原因

      本文链接:https://www.haomeiwen.com/subject/zhcwertx.html