-
Spring事務(wù)管理的兩種方式
【1】編程式的事務(wù)管理:手動在程序中編寫代碼實現(xiàn)事務(wù)管理,實際應(yīng)用中很少使用,通過TransactionTemplate管理事務(wù)。
【2】聲明式的事務(wù)管理:使用XML配置實現(xiàn)事務(wù)管理,推薦使用(代碼侵入性最?。?,Spring的聲明式事務(wù)管理是通過AOP實現(xiàn)的(沒有代碼之前開啟事務(wù),代碼完成后提交事務(wù))。
搭建事務(wù)管理環(huán)境(模擬轉(zhuǎn)賬環(huán)境)
【a】創(chuàng)建表及插入記錄
【b】創(chuàng)建項目并引入jar包
【c】引入log4j.properties、applicationContext.xml、jdbc.properties配置文件。
【e】創(chuàng)建包結(jié)構(gòu),編寫Dao及Service
【f】spring配置文件編寫
【g】Dao中獲取JDBC模板
首先Dao實現(xiàn)類需要繼承JdbcDaoSupport類,該類中就會注入JDBC模板,該類中定義了JDBC模板,并提供set方法只要Dao中注入模板就可以
。也可以通過注入連接池獲取JDBC模板。
【h】Dao方法具體編寫
【i】Service中注入Dao,并調(diào)用Dao中的方法
【k】測試:由于Junit4和spring整合的包已經(jīng)引入,所以通過注解@ContextConfiguration注解加載配置文件,這里使用注解@Resource(name="")方式注入AccountService。
查看全部 -
TransactionStatus接口介紹
TransactionStatus接口:提供了獲取事務(wù)狀態(tài)的方法(例如:hasSavepoint()事務(wù)是否有保存點,isCompleted()事務(wù)是否已經(jīng)完成,isNewTransaction()是否是新的事務(wù))。
查看全部 -
TransactionDefinition定義事務(wù)傳播行為
事務(wù)的傳播行為:解決業(yè)務(wù)層方法之間相互調(diào)用的問題(一個service層里的方法調(diào)用另一個service里中的方法,這兩個service中又分屬于兩個不同的事務(wù),傳播行為就是為了解決方法調(diào)用時事務(wù)的傳遞)。
事務(wù)的傳播行為有7種,可以為3類:
第一類為前三個,重點掌握第一個(在相同事務(wù)里):支持當(dāng)前事務(wù)(Service中bbb()調(diào)用Service中aaa()方法時,如果aaa()有事務(wù),則使用該事務(wù)。如果沒有事務(wù),則使用bbb()當(dāng)前事務(wù),如果當(dāng)前bbb()也沒有事務(wù),就會新創(chuàng)建一個事務(wù))
第二類為接下來三個,重點掌握第一個(在不同事務(wù)中):如果aaa()有事務(wù)存在,掛起當(dāng)前事務(wù),創(chuàng)建一個新的事務(wù)(aaa()和bbb()不在一個事務(wù)中)。
第三類:如果當(dāng)前事務(wù)存在,則嵌套事務(wù)執(zhí)行(執(zhí)行aaa()完后,會使用事務(wù)的保存點,在執(zhí)行bbb()時如果發(fā)生異常,可以回滾到設(shè)置的保存點,也可以回滾到最初始的狀態(tài))。
查看全部 -
TransactionDefinition定義事務(wù)隔離級別
TransactionDefinition接口:通過Spring的API可以知道該接口提供了一組常量。
如下圖以ISOLATION開頭的五個隔離級別。
如下圖以PROPAGATION_MANDATORY開頭的7個傳播行為。
如下圖以TIMEOUT開頭的超時信息
該接口還提供了一些方法,例如:獲得隔離級別、獲得超時信息、獲得是否只是只讀的等。
如果不考慮隔離性,就會引發(fā)安全問題:臟讀、不可重復(fù)讀、以及虛讀或者叫做幻讀。
臟讀:一個事務(wù)讀取了另一個事務(wù)改寫但還未提交的數(shù)據(jù),如果這些數(shù)據(jù)被回滾,則讀到的數(shù)據(jù)是無效的。
不可重復(fù)讀:同一事務(wù)中,多次讀取同一數(shù)據(jù)返回的結(jié)果有所不同(讀取到另一個事務(wù)已經(jīng)提交的更新的數(shù)據(jù))。
幻讀:一個事務(wù)讀取了幾行記錄后,另一個事務(wù)插入一些記錄,幻讀就發(fā)生了。再后來的查詢中,第一個事務(wù)就會發(fā)現(xiàn)有些原來沒有的記錄。
正常情況下,數(shù)據(jù)庫提供了四種隔離級別:
READ_UNCOMMITED:安全級別最低,如果設(shè)置為該級別,就可能會發(fā)生臟讀、不可重復(fù)讀、幻讀等。
READ_COMMITED:如果設(shè)置該級別,可以避免臟讀的發(fā)生,但是可能會發(fā)生不可重復(fù)讀和幻讀。
REPEATABLE_READ:如果設(shè)置該級別,可以避免臟讀和不可重復(fù)讀,但是可能會發(fā)生幻讀。
SERIALIZABLE:事務(wù)是串行的,不會發(fā)生并發(fā)訪問這種情況
Spring提供了DEFAULT,它代表使用數(shù)據(jù)庫默認的隔離級別(例如:Mysql默認采用REPEATABLE_READ隔離級別,Oracle默認采用READ_COMMITTED隔離級別)。
查看全部 -
PlatformTransactionManager接口介紹:
通過Spring的API可以知道該接口有許多實現(xiàn)類例如:DataSourceTransactionManager、HibernateTransactionManager等。Spring會為不同的持久化框架提供了不同PlatformTransactionManager接口實現(xiàn)。
比如當(dāng)我們使用SpringJDBC或者iBatis進行持久化數(shù)據(jù)時使用DataSourceTransactionManager。
通常我們使用的是DataSourceTransactionManager和HibernateTransactionManager。
查看全部 -
Spring中的事務(wù)管理:Spring提供了一組接口進行事務(wù)的管理。
Spring提供事務(wù)管理的3個接口:
【1】PlatformTransactionManager:事務(wù)管理器,用來管理事務(wù)的接口,定義了事務(wù)的提交、回滾等方法。
【2】TransactionDefinition:事務(wù)定義信息(隔離級別、傳播行為、是否超時、是否只讀)
【3】TransactionStatus:事務(wù)具體運行狀態(tài)(事務(wù)是否提交,事務(wù)是否有保存點,事務(wù)是否是新事物等狀態(tài))。
Spring事務(wù)管理時,這三個接口是有聯(lián)系的,Spring首先會根據(jù)事務(wù)定義信息TransactionDefinition獲取信息,然后由事務(wù)管理器PlatformTransactionManager進行管理,在事務(wù)管理過程中,會產(chǎn)生一個事務(wù)的狀態(tài),這個狀態(tài)就保存在事務(wù)具體運行狀態(tài)TransactionStatus中了。
查看全部 -
事務(wù)的基本概念:事務(wù)指的是邏輯上的一組操作,這組操作要么全部成功,要么全部失敗。
事務(wù)的特性:原子性、一致性、隔離性、持久性。
原子性:事務(wù)是一個不可分割的工作單位,事務(wù)中的操作要么都發(fā)生,要么都不發(fā)生。
一致性:事務(wù)前后數(shù)據(jù)的完整性必須保持一致。
隔離性:多個用戶并發(fā)訪問數(shù)據(jù)庫時,一個用戶的事務(wù)不能被其他用戶的事務(wù)所干擾,多個并發(fā)事務(wù)之間數(shù)據(jù)要相互隔離(數(shù)據(jù)庫中相應(yīng)的數(shù)據(jù)隔離級別,通過它避免事務(wù)間的沖突)。
持久性:一個事務(wù)一旦被提交,它對數(shù)據(jù)庫中數(shù)據(jù)的改變是永久性的,即使數(shù)據(jù)庫發(fā)生故障也不應(yīng)該對其有任何影響。
查看全部 -
在需要使用事務(wù)的業(yè)務(wù)實現(xiàn)類前添加 @Transactional 注解,便可引入到事務(wù)管理中,同時事務(wù)的傳播行為、隔離級別等都存在于@Transactional 注解的屬性中,根據(jù)需求聲明賦值便可!
查看全部 -
聲明式事務(wù)管理中,基于注解的方式實現(xiàn):
默認需要配置 org.springframeword.jdbc.datasource.DataSourceTransactionManager 外;
只需要添加開啟注解事務(wù)的配置即可:
<tx:annotatioon-drivern transaction-manager="transactionManager">
查看全部 -
此處業(yè)務(wù)層的代理 的配置 基于? TransactionProxyFactoryBean 類進行了增強操作,主要操作,通過配置目標(biāo)對象,將事務(wù)管理器注入并配置響應(yīng)的事務(wù)屬性,在 <property><props></props></property>中配置實際需要增強的功能,即事務(wù)的傳播行為;隔離級別只讀,異?;貪L處理等....
注意: 業(yè)務(wù)功能增強是在本配置中實現(xiàn),通過配置目標(biāo)對象<property name="target" ref="accountService">將業(yè)務(wù)接口引入,并在當(dāng)前配置中做增強;因此真正具有增強功能的 是? "accountServiceProxy" 這個類,在引入 業(yè)務(wù)接口時需要通過 @Resource 引入 "accountServiceProxy"
查看全部 -
此處的accountService類沒有被增強過;實際增強的類是配置業(yè)務(wù)層的的代理中的 “id= accountServiceProxy”類<br/>查看全部
-
本方法需要在業(yè)務(wù)接口上注入代理類,如圖中, @Resource(name="accountServicceProxy")
private AccountService accountService;
查看全部 -
聲明式事務(wù)管理中,基于TransactionProxyFactoryBean的XML方式實現(xiàn):
默認需要配置 org.springframeword.jdbc.datasource.DataSourceTransactionManager 外;
還要配置具體的業(yè)務(wù)層的代理,即事務(wù)代理的主要項:
org.springframeword.transaction.interceptor.TransactionProxyFactoryBean
查看全部 -
事務(wù)的通知中,可以增強的具體內(nèi)容有以下幾點:
事務(wù)傳播行為;
事務(wù)隔離級別;
只讀;
發(fā)生哪些異?;貪L;
發(fā)生哪些異常不回滾
查看全部 -
使用aop:config配置切入點,使用aop:pointcut?? 的 id 作為切入點的 坐標(biāo);調(diào)用 aop:advisor 配置切面,引入事務(wù)的增強? -- "txAdvice",將其指向要生效的切入點 -- "pointcut1";當(dāng)excution 中對應(yīng)的方法被調(diào)用時,該切入點會被配置的事務(wù)進行增強查看全部
舉報