1.作用
@Transactional 注解的作用是标记一个方法或类需要进行事务管理。使用 @Transactional 注解的方法或类,在执行时会被 Spring 框架自动处理事务的提交和回滚。具体而言,@Transactional 注解的作用包括以下几个方面:
-
事务开启:被 @Transactional 注解标记的方法或类在执行时,会自动启动一个事务。这意味着在方法内部的数据库操作会被包含在一个事务中,保证了数据的一致性和完整性。
-
事务提交:方法执行成功(没有发生异常)时,事务会自动进行提交,将对数据库的修改永久保存。
-
事务回滚:当方法内部发生异常时,事务会被回滚,将之前对数据库的修改全部撤销,保证数据的一致性。回滚可以避免数据库数据被不完整或错误的修改。
-
事务管理:@Transactional 注解还可以设置事务的属性,如隔离级别、传播行为、只读属性等,用于控制事务的行为和范围。可以根据具体需求进行配置,以满足应用程序的事务管理需求。
总结而言,@Transactional 注解的作用是声明方法或类需要进行事务管理,它自动启动事务、提交事务、回滚事务,同时还提供了属性配置用于控制事务的行为和范围。使用 @Transactional 注解可以简化事务管理的操作,提高代码的可读性和可维护性。
2.原理
Spring中的@Transational注解是基于JDBC的事务来进行事务控制的,在spring中通过Aop获取事务管理对象生成代理对象(aop中的反射)之后,再对代理对象添加相应的事务管理代码,所有来自外部的请求(请求事务管理对象的请求)都会被代理对象拦截。这样就实现了对事务管理对象的事务管理。是动态代理设计模式的具体表现
3.容易导致注解失效的点
1.注解标记的方法或者类不是public权限,会导致注解失效
原因:因为注解是通过Aop实现的,而Aop的底层是通过反射机制来获取对象并生成代理对象的,所以当方法或者类的权限不是public,就无法获取对象。
2.只有外部的请求才会使得事务生效
原因:因为 Spring AOP 是基于代理对象的,在方法内部自我调用不会触发代理逻辑,因此事务管理也不会生效
3.方法内部捕获了异常事务机制失效
当在方法内部捕获了异常时,事务机制可能会失效。这是因为事务的回滚是由异常的传播机制触发的,如果在方法内部捕获了异常并进行了处理,那么异常就不会再继续传播,从而导致事务不会进行回滚。在默认情况下,Spring 的事务管理器会捕获并检查抛出的异常,根据异常的类型决定是否回滚事务。如果异常没有被捕获,或者被捕获后没有再次抛出,事务管理器会识别到异常,并触发事务的回滚。默认情况下,RuntimeException和Error的情况下,spring事务才会回滚。