您好,登錄后才能下訂單哦!
Spring的事務(wù)
事務(wù)使用ACID特性來衡量事務(wù)的質(zhì)量。這些特性包括原子性、一致性
隔離性和持久性。
a.原子性:事務(wù)必須是原子的。不可分割的,在事務(wù)結(jié)束的時(shí)候,事務(wù)中的所有任務(wù)必須全部成功完成或者全部任務(wù)失敗,事務(wù)回滾到事務(wù)開始之前的狀態(tài)
b.一致性:數(shù)據(jù)庫中的所有數(shù)據(jù)必須和現(xiàn)實(shí)保持一致。
c.隔離性:事務(wù)與事務(wù)之間的屏障。每個(gè)事務(wù)必須與其他事務(wù)的執(zhí)行結(jié)果隔離開,直到該事務(wù)執(zhí)行完畢。
d.持久性:如果事務(wù)成功執(zhí)行,無論系統(tǒng)發(fā)生什么情況,事務(wù)的持久性必須保證事務(wù)的執(zhí)行結(jié)果是永存的。
在事務(wù)處理中有違反ACID特性的三個(gè)問題:臟讀、不可重復(fù)讀和幻讀。
臟讀:當(dāng)一個(gè)事務(wù)讀取了一個(gè)事務(wù)尚未提交的更新,就叫作臟讀取。
不可重復(fù)讀:在一個(gè)事務(wù)中執(zhí)行多次同樣的查詢操作,但每次查詢的結(jié)果都不相同,叫不可重復(fù)讀
幻讀:一個(gè)事務(wù)的更新結(jié)果影響到了另一個(gè)事務(wù)的問題。
Spring的事務(wù)管理器有5個(gè),也即DataSourceTransactionManager(JDBC事務(wù)管理器),HibernateTransactionManager(Hibernate事務(wù)管理器),JdoTransactionManager(JDO事務(wù)管理器),JtaTransactionManager(Jta事務(wù)管理器)以及Apache的OJB事務(wù)管理器。
Spring支持聲明式事務(wù),并建議這樣做。因?yàn)镾pring中的事務(wù)是基于AOP實(shí)現(xiàn)的,而Spring的AOP是以方法為單位的,所以Spring的事務(wù)屬性就是對事務(wù)應(yīng)用到方法的策略描述,這些屬性分別為:傳播行為、隔離級別、只讀和超時(shí)屬性。
事務(wù)的傳播行為是事務(wù)應(yīng)用于方法的邊界,它定義了事務(wù)的建立、暫停等行為。
事務(wù)的隔離級別:為了解決事務(wù)之間的3個(gè)缺陷,必須在事務(wù)之間建立隔離關(guān)系來保障事務(wù)的完整性。
事務(wù)的只讀屬性:在數(shù)據(jù)庫的操作中,查詢是使用最頻繁的操作,每次執(zhí)行查詢操作時(shí)都要從數(shù)據(jù)庫中重新讀取數(shù)據(jù),有時(shí)多次讀取的數(shù)據(jù)都是相同的,這樣的操作浪費(fèi)了系統(tǒng)資源和影響了系統(tǒng)速度。如果將食物聲明為只讀,那么數(shù)據(jù)庫可以根據(jù)事務(wù)的特性優(yōu)化事務(wù)的讀取操作。事務(wù)的只讀屬性需要配合事務(wù)的PROPAGATION_REQUIRED、PROPAGATION_REQUIRES_NEW和PROPAGATION_NESTED傳播行為共同設(shè)置。
事務(wù)的超時(shí)屬性:設(shè)置了事務(wù)的超時(shí)時(shí)間。
Spring的聲明式事務(wù)不涉及組建依賴關(guān)系,它通過AOP實(shí)現(xiàn)事務(wù)管理。在使用Spring的聲明式事務(wù)時(shí)不需要編寫任何代碼。使用事務(wù)代理工廠來管理事務(wù)。事務(wù)代理工廠TransactionProxyFactoryBean包含了事務(wù)攔截器、目標(biāo)代理和事務(wù)的屬性設(shè)置。
Spring使用注解式進(jìn)行事務(wù)管理,配置示例
步驟一、在Spring配置文件中引入<tx:>命名空間
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
步驟二、具有@Transactional注解的bean自動(dòng)配置為聲明式事務(wù)
<!-- 事務(wù)管理 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> <!-- 配置事務(wù)增強(qiáng)器 --> <tx:advice id="transactionAdvice" transaction-manager="transactionManager"> <!-- 配置詳細(xì)事務(wù)處理語義 --> <tx:attributes> <tx:method name="insert*" propagation="REQUIRED"/> <tx:method name="update*" propagation="REQUIRED"/> <tx:method name="delete*" propagation="REQUIRED"/> <tx:method name="save*" propagation="REQUIRED"/> <tx:method name="add*" propagation="REQUIRED"/> <tx:method name="saveOrUpdate*" propagation="REQUIRED"/> <tx:method name="get*" propagation="SUPPORTS"/> <tx:method name="find*" propagation="SUPPORTS"/> <tx:method name="load*" propagation="SUPPORTS"/> <tx:method name="select*" propagation="SUPPORTS"/> <!-- 其他采用默認(rèn)方式 --> <tx:method name="*"/> </tx:attributes> </tx:advice> <!-- SpringAOP事務(wù)管理 --> <aop:config> <aop:pointcut expression="execution(* com.jf.service..*impl.*(..))" id="transactionPointCut"/> <!-- 指定txAdvice切入點(diǎn)應(yīng)用txAcvice食物增強(qiáng)處理 --> <aop:advisor advice-ref="transactionAdvice" pointcut-ref="transactionPointCut"/> </aop:config>
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。