spring中事务的实现方式和失效场景
实现方式:
1、编程式事务,这种方式需要我们在业务代码中手动beginTransactional(),commit(),rollback(),因此使用较少;
2、声明式事务,这种方式是建立在AOP之上的,其本质是对方法的前后进行拦截,然后在目标方法的开始前创建或者加
入一个事务,在执行完目标方法之后根据执行结果提交或者回滚事务;这种方式的优点在于无需在业务代码中掺杂相
应的事务管理的方法,只需要在配置文件中加入相关的事务规则声明或者使用注解的方式就可以实现;
失效场景(面试的时候有时会问到):
首先呢,一般来说,事物的开启和关闭都是在service中
0、所用数据库的引擎是否支持事务(myISAM不支持)
1、事务所在的bean是否为spring所管理(@Service\@Bean\@Compent等)
2、spring的事务管理必须是针对public修饰的方法(否则,不报错,不生效)
3、是否发生了自调用(在当前类中调用事务方法,因为没有经过spring的代理类,默认只有在外部调用才会生效)
3、当在事务修饰的方法中显示捕捉异常的时候,事务失效(正常应该是service中抛出异常,使用controller或者统一异常处理器处理异常)