溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

SSH、IBatis等框架相關(guān)知識

發(fā)布時(shí)間:2020-08-01 14:59:48 來源:網(wǎng)絡(luò) 閱讀:396 作者:kuchensheng 欄目:開發(fā)技術(shù)

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>


向AI問一下細(xì)節(jié)

免責(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)容。

AI