天天看点

详解Spring的声明式事务

事务(Transactional):

在软件开发领域,全有或全无的操作被称作事务,事务具有四个特性:ACID。

A:Atomic 原子性    确保事务中的所有操作全部发生或全部不发生

C:Consistent 一致性    事务的执行结果是确定

I:Isolated 隔离性     事务是彼此隔离的,避免同步读写相同数据

D:Durable 持久性     事务的结果是持久化的

Spring提供的事务管理器:

DataSourceTransactionManager  用于对jdbc和ibatis进行持久化的场景,实现了PlatformTransactionManager接口

利用IOC实例化配置如下:

事务属性:

1、传播行为:定义了何时要创建一个事务或何时使用已有的事务;

2、隔离级别:定义了一个事务可能受其他并发事务影响的程度;

3、回滚规则:定义什么异常下回滚

4、事务超时:自动回滚时间

5、是否只读:对读数据库操作加声明,系统就会对该操作优化

Spring中声明事务的注解如下:

上面的配置告诉Spring检查上下文中所有的Bean并查找使用@Transactional注解的Bean,不论注解级别是用在类级别上还是方法级别上,

找到Bean后会自动为它添加事务通知。

事务拦截器(AOP)

TransactionInterceptor调用invoke(final MethodInvocation invocation)进行事务处理

AnnotationTransactionAttributeSource调用findTransactionAttribute(Method method)和findTransactionAttribute(Class<?> clazz)方法

获取TransactionAttribute(@Transactional注解中设置的五个事务属性参数)

类SpringTransactionAnnotationParser调用parseTransactionAnnotation方法生成TransactionAttribute(存储事务属性)

如果事务属性为空,则认为为非事务方法,直接调用原方法

CallbackPreferringPlatformTransactionManager调用execute(TransactionDefinition definition, TransactionCallback<T> callback)

TransactionCallback是处理事务的回调模板类(接口)

CallbackPreferringPlatformTransactionManager 继承自 PlatformTransactionManager

DataSourceTransactionManager实现的事务提交与回滚方法:

依懒接口:java.sql.Connection

Connection最终实现的类:com.mysql.jdbc.ConnectionImpl.class

详解Spring的声明式事务

利用visualvm查看JVM中的实例结果如下:

详解Spring的声明式事务

可以看出AOP代理和回调

详解Spring的声明式事务