事务(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

利用visualvm查看JVM中的实例结果如下:
可以看出AOP代理和回调