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