-
Spring事務管理課程:
查看全部 -
spring事務管理高層抽象主要包括3個接口
PlatformTransactionManager (事務管理器)
TransactionDefinition (事務定義信息(隔離,傳播,超時,只讀))
TransactionStatus (事務具體運行狀態)
查看全部 -
log4文件:http://www.xianlaiwan.cn/qadetail/303285
java.lang.IllegalStateException: Failed to load ApplicationContext解決方法:http://www.xianlaiwan.cn/qadetail/189429
查看全部 -
Spring事務管理的兩種方式
1、編程式的事務管理:手動在程序中編寫代碼實現事務管理,實際應用中很少使用,通過TransactionTemplate管理事務。
2、聲明式的事務管理:使用XML配置實現事務管理,推薦使用(代碼侵入性最?。琒pring的聲明式事務管理是通過AOP實現的(沒有代碼之前開啟事務,代碼完成后提交事務)。
搭建事務管理環境(轉賬環境)
【a】創建表及插入記錄
【b】創建項目并引入jar包
【c】引入log4j.properties、applicationContext.xml、jdbc.properties配置文件。
【e】創建包結構,編寫Dao及Service
【f】spring配置文件編寫
查看全部 -
TransactionStatus接口介紹
TransactionStatus接口:提供了獲取事務狀態的方法(例如:hasSavepoint()事務是否有保存點,isCompleted()事務是否已經完成,isNewTransaction()是否是新的事務)。
查看全部 -
服務器端分為三層:web層,業務層和持久層。
事務加在業務層。
TransactionDefinition定義事務傳播行為
事務的傳播行為:解決業務層方法之間相互調用的問題(一個service層里的方法調用另一個service里中的方法,這兩個service中又分屬于兩個不同的事務,傳播行為就是為了解決方法調用時事務的傳遞)。
事務的傳播行為有7種,可以為3類:
第一類為前三個,重點掌握第一個(在相同事務里):支持當前事務(Service中aaa()調用Service中bbb()方法時,如果aaa()有事務,則bbb()使用該事務。如果aaa()沒有事務,則bbb()就會創建一個事務),然后把aaa()里的內容包起來。
第二類為接下來三個,重點掌握第一個(在不同事務中):如果aaa()有事務存在,掛起當前事務,創建一個新的事務(aaa()和bbb()不在一個事務中)。
第三類:如果當前事務存在,則嵌套事務執行(執行aaa()完后,會使用事務的保存點,在執行bbb()時如果發生異常,可以回滾到設置的保存點,也可以回滾到最初始的狀態)。
查看全部 -
事務的定義:
事務指的是邏輯上的一組操作,這組操作要么全部成功,要么全部失敗。
事務的特性:原子性、一致性、隔離性、持久性 (ACID)。
原子性:事務是一個不可分割的工作單位(其中的操作不能單獨運行),事務中的操作要么都發生,要么都不發生。
一致性:事務前后數據的完整性必須保持一致。
隔離性:多個用戶并發訪問數據庫時,一個用戶的事務不能被其他用戶的事務所干擾,多個并發事務之間數據要相互隔離(數據庫中相應的數據隔離級別,通過它避免事務間的沖突)。
持久性:一個事務一旦被提交,它對數據庫中數據的改變是永久性的,即使數據庫發生故障也不應該對其有任何影響。
查看全部 -
課程目標
-Spring事務管理的一組API
-Spring的編程式事務管理
-Spring的聲明式事務管理
查看全部 -
事務管理的兩種方式
查看全部 -
事務傳播行為
查看全部 -
Spring將事物管理分成了兩類:
【1】編程式事務管理:手動編寫代碼進行事物管理(很少使用)
【2】聲明式事務管理:
基于TransactionProxyFactoryBean的方式(很少使用)
——需要為每個進行事務管理的類,配置一個代理類,后期維護和管理不方便。
基于AspectJ的XML方式(經常使用)
——可以清晰的在XML配置文件中,查看到哪些類哪些方法應用事物管理,業務層上不需要添加任何東西。
基于注解方式(經常使用)
——使用簡單,需要為每一個需要事務管理的業務層上添加注解@Transactional。
查看全部 -
聲明式事務管理方式三:基于注解的方式
加載測試環境:Spring提供的,@RunWith(SpringJUnit4ClassRunner.class),只有加載它了,才可以使用@Test注解。
加載配置文件:@ContextConfiguration(classpath:相對路徑)。
【1】配置事物管理器
【2】開啟注解事物
【3】添加注解@Transactional(哪個類上需要事物管理就在哪個類上添加注解)
該注解中也包含一些屬性(傳播行為、隔離級別、超時、異常),如果不寫,都會按默認值來處理。
查看全部 -
聲明式事物管理方式二:基于AspectJ的XML方式
實際開發中,不經常使用第一種方式(TransactionProxyFactoryBean代理類),因為這種方式需要為每一個需要事務管理的Service配置一個TransactionProxyFactoryBean,開發和維護帶來不便。
【1】引入AspectJ的jar包和整合AspectJ的包。
AspectJ簡介:Spring在開發AOP時,為了簡化編程而建立的。(AspectJ實際是開源的、第三方的AOP開發框架,Spring為簡化自身開發,就引入了AspectJ的包)
【2】配置事物管理器,并注入數據源dataSource。
【3】配置事物的通知(事物的增強,通過<tx:advice id=""? transaction-manager="事物管理器Id"></tx:advice>,這個標簽中需要配置事物相關的一些屬性<tx:attributes></tx:attributes>,該屬性的作用就是哪些方法執行事務,<tx:method="方法名"></tx:method>如果多個方法可以用英文單詞*,該標簽中還定義了事物的傳播行為、隔離級別、超時信息、只讀等等屬性)
事物增強的一些屬性信息。
【4】配置AOP的切面(通過<aop:config></aop:config>,在<aop:config>下需要配置切入點<aop:point-cut expression="" id=""></aop:point-cut>,其中表達式最前面的*表示方法返回值為任意的,+號表示及其子類,.*表示任意的方法,(..)表示任意的參數,接下來需要配置切面其中<aop:aspect>代表多個切入點,多個通知,而<aop:advisor>是一個切入點,一個通知的。這里使用它即可。因為現在只有一個增強即事物增強,這樣AccountService即其子類的任意方法都會事物增強了)
該聲明式事務管理就不需要再注入代理了,這種方式屬于自動代理,自動代理一般是基于BeanPostProcessor這個類,也就是類生成過程中(Serivice)本身就是一個代理。
查看全部 -
基于TransactionProxyFactoryBean實現聲明式事物管理:基于AOP來實現事物管理功能(也就是在執行Dao中方法前后做一些操作)。
【1】引入AOP的jar包。
【2】配置事物管理器。
【3】實現事務管理可以為Service提供一個代理類,該代理類可以對Service方法進行增強。這里在配置文件中使用Spring傳統的AOP方式配置代理類。
Spring傳統的事務管理的操作中,提供了一個事物代理的工廠類TransactionProxyFactoryBean,它就可以為某一個Service產生代理對象。其中該事物代理工廠需要注入一個屬性,該屬性就是目標對象。接下來就會產生代理對象,產生的代理對象還需要事務管理,所以還需注入事務管理器。
要想事物管理還需要一些定義信息例如:隔離級別、傳播行為。所以還需要注入一些事物屬性,通過TransactionProxyFactoryBean源碼可知,該事物屬性該怎樣配置,如圖2。為何這樣配置,可以找到setTransactionAttributes方法,該方法參數是Properties類型。
通過源碼可知key的值為insert開頭的任意方法就使用PROPAGATION_REQUIRED傳播行為,其他同理。
prop的格式:
PROPAGATION:事物的傳播行為。
ISOLATION:事物的隔離級別。
readOnly:只讀。
-Exception:發生哪些異?;貪L事物(默認情況下發生任何異常都會回滾事物)。
+Exception:發生哪些異常事物不會滾,仍然提交事物。
首先需要配置傳播行為,傳播行為必須要配置。這里配置PROPAGATION_REQUIRDE傳播行為,它是保證業務層之間方法相互調用時在同一個事物中。
業務層無需改動,因為該方式事務管理是AOP方式實現,但是測試這里需要改動需要注入代理類,AccountServiceImpl是沒有增強的類,而accountServiceProxy才是對AccountServiceImpl增強以后的類,它才具備事物處理的功能。,所以測試類需要注入accountServiceProxy,這是就可以進行實物管理了。
當事物設置成readOnly就不進行修改、刪除、插入操作了。如果這情況下設置成readOnly就會發生錯誤。
如果使用+Exception,會發生事物仍然會提交,但不會回滾,該情況也就是錢仍然會被轉丟。
查看全部 -
編程式事務管理
Spring為簡化編寫代碼,提供了事務管理模板TransactionTemplate,TransactionTemplate依賴DataSourceTransactionManager(使用SpirngJDBC時事務的管理類,它是PlatformTransactionManager接口的實現類),DataSourceTransactionManager依賴DataSource(例如service需要使用事務,只需要在service中注入改模板即可,JDBC是通過Connection對象來對事務進行管理,而SpringJDBC配置事務時也需要這樣的對象進行管理,這里是在配置事務管理器DataSourceTransactionManager的bean標簽里來注入連接池實現的,如圖)。
配置事務管理器
配置事務管理器模板
編程式事務管理就是在需要使用事務的地方手動編寫代碼,所以需要在Service層里注入該模板,這時Service調用Dao中的兩個方法就處于同一個事務中了。
通過模板的方法就可以實現業務回滾,execute(TransactionCallBack<T> transactionCallBack),TransactionCallBack實際是一個接口,可以手動創建一個類實現給接口,在傳入該對象。也可以使用匿名內部類的形式,匿名內部類的方法里就可以進行事務的操作了,該方法里的參數是事務的狀態對象,而且一個方法里的參數中匿名內部類想使用外部傳入的參數,需要使用final修飾該參數。如下圖
查看全部
舉報