天天看點

詳解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的聲明式事務