spring事务的实现原理
spring事务的底层实现主要使用的技术AOP(动态代理)+ThreadLocal+try catch
- 动态代理:基本所有进行逻辑增强的地方都会使用动态代理,AOP就是通过动态代理实现的
- ThreadLocal:主要用于线程间的资源隔离,以此实现不同线程可以使用不同的数据源、隔离级别等。
- try catch :最终执行commit 还是rollback,是根据业务逻辑是否抛出异常来决定的。
spring事务的核心逻辑伪代码如下:
public void invokeWithinTransaction (){
// 1、事务资源准备
try{
// 2、业务逻辑处理,即调用被代理的对象
}catch(Exception e){
// 3、出现异常回滚抛出
}finally{
// 4、还原就的事务信息:无论是否有异常这里都会执行
}
// 5、正常事务提交,结果返回:如果异常了这里就不会执行
}
spring的事务传播行为有哪些
(1)子事务的区别
1、Required(Spring默认的事务传播级别)
如果上下文已经存在事务,就加入到事务中,否则新建事务。
2、Supports
如果上下文已经存在事务,就加入到事务中,否则不用事务。
3、Not_Supported
如果上下文已经存在事务,将事务挂起,不用事务执行当前逻辑,运行完回复上下文事务。
(2)都会新建事务的区别
4、Requires_New
上下文无论是否存在事务,都会新建事务。子事务与父事务两者无关联,都是单独提交事务。
5、Nested
上下文无论是否存在事务,都会新建事务。子事务与父事务两者事务一起提交一起回滚。
(3)事务是否必须的区别
6、Never
上下文必须不能含有事务,否则就报错
7、Mandatory
上下文必须有事务,否则就报错
spring事务的隔离级别怎么做的?
spring本身没有事务隔离级别,都是基于数据库实现的。在执行事务之前通过语句设置当前数据库会话的隔离级别
set session transaction isolation level read committed