# 事务

介绍spring事务

# spring 事务失效场景

<div id="bkmrk-"><div>  
</div></div>##### 一、Spring事务失效的几种常见场景：

<div class="item-container_62BMH" id="bkmrk-%C2%A0-%E6%96%B9%E6%B3%95%E4%B8%8D%E6%98%AFpublic%E7%9A%84%EF%BC%9Aspring"><div class="content-box_1t3WR"><div><div><div class="dqa-markdown_5emil "><div class="markdown_1jK8o ">1. 方法不是public的：Spring的AOP代理只适用于public方法。如果你的方法不是public，Spring将无法创建代理来管理事务。
2. 方法不是同一个实例的：如果你在方法调用时使用了不同的实例（可能是通过new关键字直接创建的实例，而不是通过Spring容器获取的实例），Spring将无法管理这个方法的事务。
3. 事务方法被静态方法调用：Spring事务需要通过代理类调用事务方法，而静态方法不能被代理。
4. 事务方法内部调用：如果在事务的方法内部调用了另一个方法，且该方法也被声明为事务性方法，内部方法不会参与外部方法的事务。
5. 异常处理不当：默认情况下，Spring事务只有在运行时异常(RuntimeException)和错误(Error)发生时才会回滚。如果捕获了异常并且没有重新抛出，事务不会回滚。
6. 未正确配置@Transactional注解：例如，propagation、isolation等属性设置不当，可能导致事务行为不符合预期。
7. 数据库本身不支持事务：例如，某些数据库如MyISAM不支持事务，若配置在这类数据库上，事务将不会生效。
8. 事务方法未在事务管理的Bean中：如果事务方法不在Spring管理的Bean中，或者没有配置为Bean，事务将不会生效。
9. 方法不是Bean的自己的方法：如果方法是通过类的实例（非Bean实例）调用的，Spring无法创建事务。
10. 异步方法没有正确配置：如果你使用了@EnableAsync和@Async注解，并希望在事务方法中异步执行某些操作，确保异步方法被正确配置，否则事务可能不会按预期工作。
11. 没有加@Configuration注解

</div></div></div></div></div></div>解决这些问题的方法通常涉及到确保方法是public的，确保使用Spring容器管理的Bean，检查@Transactional注解的使用，确保数据库支持事务，并且正确处理异常。

##### 二、图例

[![image.png](http://wiki.shopqorg.com/uploads/images/gallery/2024-05/scaled-1680-/VEGimage.png)](http://wiki.shopqorg.com/uploads/images/gallery/2024-05/VEGimage.png)