1.java底层是怎样实现事务的
Java事务是作用于Connection之上的(出自:Java事务处理全解析(二)—— 失败的案例),所以
事务的传播本质是解决一个Connection对象是否在当前线程不同函数共享的问题
对于Connection对象在当前线程不同函数中的传递问题,在以下博客有说:
介绍了将Connection作为参数在函数间传递
Java事务处理全解析(四)—— 成功的案例(自己实现一个线程安全的TransactionManager)
建立了全局共享区,且利用ThreadLocal实现线程安全的全局共享Connection
下面那篇博客引用重要结论:
路线:
connection仓库(ThreadLocal确保Connection对象线程安全)-try catch finnally模版 - java动态代理(含注解处理)-- ioc代理类依赖bean自动回写(当动态代理遇到ioc)
2. spring 的 事务干了什么
spring封装了不同隔离级别的connection对象;使用动态代理,将try commit catch rollback操作封装。
3.事务的传播是用来干什么的
我们都知道事务的概念,那么事务的传播特性是什么呢?(此处着重介绍传播特性的概念,关于传播特性的相关配置就不介绍了,可以查看spring的官方文档)
在我们用SSH开发项目的时候,我们一般都是将事务设置在Service层 那么当我们调用Service层的一个方法的时候它能够保证我们的这个方法中执行的所有的对数据库的更新操作保持在一个事务中,在事务层里面调用的这些方法要么全部成功,要么全部失败。那么事务的传播特性也是从这里说起的。
如果你在你的Service层的这个方法中,除了调用了Dao层的方法之外,还调用了本类的其他的Service方法,那么在调用其他的Service方法的时候,这个事务是怎么规定的呢,我必须保证我在我方法里掉用的这个方法与我本身的方法处在同一个事务中,否则如果保证事物的一致性。事务的传播特性就是解决这个问题的,“事务是会传播的”在Spring中有针对传播特性的多种配置我们大多数情况下只用其中的一种:PROPGATION_REQUIRED:这个配置项的意思是说当我调用service层的方法的时候开启一个事务(具体调用那一层的方法开始创建事务,要看你的aop的配置),那么在调用这个service层里面的其他的方法的时候,如果当前方法产生了事务就用当前方法产生的事务,否则就创建一个新的事务。这个工作使由Spring来帮助我们完成的。
以前没有Spring帮助我们完成事务的时候我们必须自己手动的控制事务,例如当我们项目中仅仅使用hibernate,而没有集成进spring的时候,我们在一个service层中调用其他的业务逻辑方法,为了保证事物必须也要把当前的hibernate
session传递到下一个方法中,或者采用ThreadLocal的方法,将session传递给下一个方法,其实都是一个目的。现在这个工作由spring来帮助我们完成,就可以让我们更加的专注于我们的业务逻辑。而不用去关心事务的问题。
那么spring 的事务传播处理是利用注解使不同的业务处理方法(方法s)都是在一个Connection中(或在不同的connection中)
NORMAL NEVER
抛异常 回滚 不
不抛 不 不
2020.4.9 work log 对本文的实践黄色底蓝色加粗开发链的实践