您的位置:首页 > 健康 > 美食 > 西安建网站_东莞市住建局官网网站_网站建站教程_杭州网站建设书生商友

西安建网站_东莞市住建局官网网站_网站建站教程_杭州网站建设书生商友

2025/3/19 3:55:14 来源:https://blog.csdn.net/qq_41041630/article/details/146277921  浏览:    关键词:西安建网站_东莞市住建局官网网站_网站建站教程_杭州网站建设书生商友
西安建网站_东莞市住建局官网网站_网站建站教程_杭州网站建设书生商友

事务传播机制是指:方法嵌套调用过程中事务的传播方式。

Transactional注解使用于类名、方法名,任何存在该注解的类都会被Cglib代理增强。
Cglib代理增强的核心功能之一:必须修改数据库连接自动提交的特性。
传播机制存在的具体形式:
Transactional注解的方法内部存在多个SQL。
Transactional注解的方法内部存在多个Transactional注解的方法互相嵌套。
以上两种传播机制的显著区别:第二种方式存在目标类的代理对象互相调用。

通俗点讲:

事务核心是将连接自动提交动作转移至用户手中,其中本地线程提供了这种可能性。
Mybatis真正获取连接执行目标SQL时,将借助DataSourceUtils类从事务同步管理的本地线程变量中尝试获取数据库连接。
Transactional注解的一个核心作用就是在执行目标方法之前提前建立数据库连接,关闭自动提交特性,并与当前线程建立绑定关系。
事务悬挂:

首次执行存在事务的方法是不存在悬挂功能。
只有REQUIRES_NEW、NOT_SUPPORTED两种传播方式存在悬挂现象。
悬挂核心是接触数据库连接与线程的绑定关系。
1.常见事务传播机制
REQUIRED:Support a current transaction, create a new one if none exists。

SUPPORTS:Support a current transaction, execute non-transactionally if none exists。如果起始事务传播类型选择SUPPORTS,则本质还是无事务运行。如果下游方法存在MANDATORY事务类型,则会抛出异常。

MANDATORY【强制事务】:Support a current transaction, throw an exception if none exists。强制要求当前存在事务,并自动加入到当前事务控制范围内。

REQUIRES_NEW:Create a new transaction, and suspend the current transaction if one exists。旧事务悬挂之后对当前SQL的操作建立新的事务,而且新旧事务之间是没有任何影响的。新旧事务只对自己目标方法发挥作用。

NOT_SUPPORTED:Execute non-transactionally, suspend the current transaction if one exists。旧事务悬挂之后,当前SQL的操作不受任何事务控制,即数据库连接都是自动提交的。并且对旧事务没有任何影响,旧事务依然对自己关注的目标方法发挥作用。

NEVER:Execute non-transactionally, throw an exception if a transaction exists。

NESTED:Execute within a nested transaction if a current transaction exists。

起始事务类型为MANDATORY:直接抛出异常,该事务必须运行在事务环境下。

起始事务类型为SUPPORTS、NOT_SUPPORTED、NEVER:直接以无事务状态运行。

起始事务类型为REQUIRED、REQUIRES_NEW、NESTED:新建事务。

起始存在事务,后续事务为NOT_SUPPORTED:悬挂起始事务,后续事务以无状态事务运行。

起始存在事务,后续事务为REQUIRES_NEW:悬挂起始事务,后续新建事务。

起始存在事务,后续事务为SUPPORTS、MANDATORY:后续事务继续共享起始事务。

起始存在事务,后续事务为NEVER:直接抛异常,禁止事务环境存在

总结

在spring中,假如一个方法加上了事务,该方法调用另外一个方法,另外一个方法也加上了事务,那么事务是如何传递1 、REQUIRED spring默认传播机制,支持事务,如果业务方法执行时已经在一个事务中,则加入当前事务,否则重新开启一个事务。2 、REQUIRES_NEW, 支持事务,每次都新开一个事务,该事务与外层事务是相互独立的, 外层报错,内层无影响,内层报错,假如外层捕捉了异常,外层也无影响。3 、NESTED 支持事务,如果当前已经在一个事务中了,则嵌套在已有的事务中作为一个子事务,如果当前没在事务中则开启一个事务,内层事务结束,要等着外层一起提交,外层回滚,内层也回滚,如果只是内层回滚,不影响外层。这个内层回滚不影响外层的特性是有前提的,否则内外都回滚。1.JDK版本要在1.4以上,有java.sql.Savepoint。因为nested就是用savepoint来实现的。2.事务管理器的nestedTransactionAllowed属性为true。3.外层捕捉内层的异常。与REQUIRED的区别,REQUIRED即是外层try-catch内层异常,外层同样会回滚的4 、SUPPORTS 支持事务,当前有事务就支持,当前没有事务就算了,不会开启一个事物。5 、MANDATORY 支持事务,如果业务方法执行时已经在一个事务中,则加入当前事务,否则抛出异常。6 、NOT_SUPPORTED 不支持事务,如果业务方法执行时已经在一个事务中,则挂起当前事务,然后执行内层方法,等方法执行完毕后,事务恢复进行。7 、NEVER 不支持事务,如果当前已经在一个事务中了,抛出异常。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com