前段時間對Spring的事務(wù)配置做了比較深入的研究,在此之間對Spring的事務(wù)配置雖說也配置過,但是一直沒有一個清楚的認(rèn)識。通過這次的學(xué)習(xí)發(fā)覺Spring的事務(wù)配置只要把思路理清,還是比較好掌握的。
站在用戶的角度思考問題,與客戶深入溝通,找到云溪網(wǎng)站設(shè)計與云溪網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:做網(wǎng)站、網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、主機(jī)域名、虛擬主機(jī)、企業(yè)郵箱。業(yè)務(wù)覆蓋云溪地區(qū)。 總結(jié)如下:
Spring配置文件中關(guān)于事務(wù)配置總是由三個組成部分,分別是DataSource、TransactionManager和代理機(jī)制這三部分,無論哪種配置方式,一般變化的只是代理機(jī)制這部分。
DataSource、TransactionManager這兩部分只是會根據(jù)數(shù)據(jù)訪問方式有所變化,比如使用Hibernate進(jìn)行數(shù)據(jù)訪問時,DataSource實際為SessionFactory,TransactionManager的實現(xiàn)為HibernateTransactionManager。
具體如下圖:
根據(jù)代理機(jī)制的不同,總結(jié)了五種Spring事務(wù)的配置方式,配置文件如下:
第一種方式:每個Bean都有一個代理
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
第二種方式:所有Bean共享一個代理基類
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
lazy-init="true" abstract="true">
第三種方式:使用攔截器
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
第四種方式:使用tx標(biāo)簽配置的攔截器
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
第五種方式:全注解
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
package com.bluesky.spring.dao;
import java.util.List;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.stereotype.Component;
import com.bluesky.spring.domain.User;
@Transactional
@Component("userDao")
public class UserDaoImpl extends HibernateDaoSupport implements UserDao {
public List
return this.getSession().createQuery("from User").list();
}
}
注意的幾點:
1、@Transactional只能被應(yīng)用到public方法上,對于其他非public的方法,如果標(biāo)記了@Transactional也不會報錯,但方法沒有事務(wù)功能。
2、默認(rèn)情況下,一個有事務(wù)方法,遇到RuntimeException時會回滾,遇到受檢查的異常是不會回滾的。要想所有異常都回滾,要加上@Transactional(rollbackFor={Exception.class, 其他異常})。
Transactional的所有可選屬性如下:
屬性 類型 默認(rèn)值 說明
propagation Propagation枚舉 REQUIRED 事務(wù)傳播屬性(下有說明)
isolation isolation枚舉 DEFAULT 事務(wù)隔離級別(另有說明)
readOnly boolean false 是否只讀
timeout int -1 超時(秒)
rollbackFor Class[] {} 需要回滾的異常類
rollbackForClassName String[] {} 需要回滾的異常類名
noRollbackFor Class[] {} 不需要回滾的異常類
noRollbackForClassName String[] {} 不需要回滾的異常類名
事務(wù)的隔離級別 有如下可選:
可以去看spring的源代碼:org.springframework.transaction.annotation.Isolation
DEFAULT 采用數(shù)據(jù)庫默認(rèn)隔離級別
READ_UNCOMMITTED
READ_COMMITTED
REPEATABLE__READ
SERIALIZABLE
事務(wù)的傳播屬性,有如下可選:
可以去看spring的源代碼:org.springframework.transaction.annotation.Propagation
REQUIRED:業(yè)務(wù)方法需要在一個事務(wù)中運行,如果方法運行時,已處在一個事務(wù)中,那么就加入該事務(wù),否則自己創(chuàng)建一個新的事物,這是spring默認(rèn)的傳播行為。
SUPPORTS:如果業(yè)務(wù)方法在某個事物范圍內(nèi)被調(diào)用,則方法成為該事務(wù)的一部分,如果業(yè)務(wù)方法在事務(wù)范圍外被 調(diào)用,則方法在沒有事務(wù)的環(huán)境下執(zhí)行。
MANDATORY:只能在一個已存在事務(wù)中執(zhí)行,業(yè)務(wù)方法不能發(fā)起自己的事物,如果業(yè)務(wù)方法在沒有事務(wù)的環(huán)境下調(diào)用,就拋異常。
REQUIRES_NEW:業(yè)務(wù)方法總是會為自己發(fā)起一個新的事務(wù),如果方法已運行在一個事務(wù)中,則原有方法被掛起, 新的事務(wù)被創(chuàng)建,直到方法結(jié)束,新事務(wù)才結(jié)束,原先的事務(wù)才會恢復(fù)執(zhí)行。
NOT_SUPPORTED:聲明方法需要事務(wù),如果方法沒有關(guān)聯(lián)到一個事務(wù),容器不會為他開啟事務(wù),如果方法在一個事務(wù)中被調(diào)用,該事務(wù)會被掛起,在方法調(diào)用結(jié)束后,原先的事務(wù)便會恢復(fù)執(zhí)行。
NEVER:聲明方法絕對不能在事務(wù)范圍內(nèi)執(zhí)行,如果方法在某個事務(wù)范圍內(nèi)執(zhí)行,容器就拋異常,只有沒關(guān)聯(lián)到 事務(wù),才正常執(zhí)行。
NESTED:如果一個活動的事務(wù)存在,則運行在一個嵌套的事務(wù)中,如果沒有活動的事務(wù),則按REQUIRED屬性執(zhí) 行。它使用了一個單獨的事務(wù),這個事務(wù)擁有多個可以回滾的保證點,內(nèi)部事務(wù)回滾不會對外部事務(wù)造 成影響,它只對DataSource。
創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國云服務(wù)器,動態(tài)BGP最優(yōu)骨干路由自動選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機(jī)房獨有T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動現(xiàn)已開啟,新人活動云服務(wù)器買多久送多久。