溫馨提示×

溫馨提示×

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

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

Spring聲明式事務(wù)控制是什么

發(fā)布時(shí)間:2021-11-03 15:30:28 來源:億速云 閱讀:189 作者:iii 欄目:編程語言

這篇文章主要講解了“Spring聲明式事務(wù)控制是什么”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Spring聲明式事務(wù)控制是什么”吧!

一、編程式事務(wù)控制相關(guān)對象

1、PlatformTransactionManager 接口是 spring 的事務(wù)管理器,它里面提供了我們常用的操作事務(wù)的方法。

Spring聲明式事務(wù)控制是什么

2、TransactionDefinition

 

TransactionDefinition 是事務(wù)的定義信息對象,里面有如下方法:

Spring聲明式事務(wù)控制是什么

1)事務(wù)隔離級別:設(shè)置隔離級別,可以解決事務(wù)并發(fā)產(chǎn)生的問題,如臟讀、不可重復(fù)讀和虛讀。

2)事務(wù)傳播行為

REQUIRED:如果當(dāng)前沒有事務(wù),就新建一個(gè)事務(wù),如果已經(jīng)存在一個(gè)事務(wù)中,加入到這個(gè)事務(wù)中。一般的選擇(默認(rèn)值)。

SUPPORTS:支持當(dāng)前事務(wù),如果當(dāng)前沒有事務(wù),就以非事務(wù)方式執(zhí)行(沒有事務(wù))。

MANDATORY:使用當(dāng)前的事務(wù),如果當(dāng)前沒有事務(wù),就拋出異常。

REQUERS_NEW:新建事務(wù),如果當(dāng)前在事務(wù)中,把當(dāng)前事務(wù)掛起。

NOT_SUPPORTED:以非事務(wù)方式執(zhí)行操作,如果當(dāng)前存在事務(wù),就把當(dāng)前事務(wù)掛起。

NEVER:以非事務(wù)方式運(yùn)行,如果當(dāng)前存在事務(wù),拋出異常。

NESTED:如果當(dāng)前存在事務(wù),則在嵌套事務(wù)內(nèi)執(zhí)行。如果當(dāng)前沒有事務(wù),則執(zhí)行 REQUIRED 類似的操作。

超時(shí)時(shí)間:默認(rèn)值是-1,沒有超時(shí)限制。如果有,以秒為單位進(jìn)行設(shè)置。

是否只讀:建議查詢時(shí)設(shè)置為只讀。

3TransactionStatus

TransactionStatus 接口提供的是事務(wù)具體的運(yùn)行狀態(tài),方法介紹如下。

Spring聲明式事務(wù)控制是什么

二、基于 XML 的聲明式事務(wù)控制

1、聲明式事務(wù)控制是什么?

Spring的聲明式事務(wù)顧名思義就是采用聲明的方式來處理事務(wù)。這里所說的聲明,就是指在配置文件中聲明,用在 Spring 配置文件中聲明式的處理事務(wù)來代替代碼式的處理事務(wù)。它的作用是事務(wù)管理不侵入開發(fā)的組件。具體來說,業(yè)務(wù)邏輯對象就不會(huì)意識到正在事務(wù)管理之中,事實(shí)上也應(yīng)該如此,因?yàn)槭聞?wù)管理是屬于系統(tǒng)層面的服務(wù),而不是業(yè)務(wù)邏輯的一部分,如果想要改變事務(wù)管理策劃的話,也只需要在定義文件中重新配置即可。而且在不需要事務(wù)管理的時(shí)候,只要在設(shè)定文件上修改一下,即可移去事務(wù)管理服務(wù),無需改變代碼重新編譯,這樣維護(hù)起來極其方便。

2、聲明式事務(wù)控制的實(shí)現(xiàn)

1)引入tx命名空間

<beans xmlns="http://www.springframework.org/schema/beans"
       

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      

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/context
       

http://www.springframework.org/schema/context/spring-context.xsd
       

http://www.springframework.org/schema/aop
       

http://www.springframework.org/schema/aop/spring-aop.xsd
       

http://www.springframework.org/schema/tx
       

http://www.springframework.org/schema/tx/spring-tx.xsd
       

http://www.springframework.org/schema/beans
       

http://www.springframework.org/schema/beans/spring-beans.xsd">

2)配置事務(wù)增強(qiáng)

<!--平臺(tái)事務(wù)管理器-->

<bean id="transactionManager"

class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
   

<property name="dataSource" ref="dataSource"></property>

</bean>

<!--事務(wù)增強(qiáng)配置-->

<tx:advice id="txAdvice" transaction-manager="transactionManager">

    <tx:attributes>
 

       <tx:method name="*"/>

    </tx:attributes>

</tx:advice>

3)配置事務(wù) AOP 織入

<!--事務(wù)的aop增強(qiáng)-->

<aop:config>

    <aop:pointcut id="myPointcut" expression="execution(* com.itheima.service.impl.*.*(..))"/>

    <aop:advisor advice-ref="txAdvice" pointcut-ref="myPointcut"></aop:advisor>

</aop:config>

4)測試事務(wù)控制轉(zhuǎn)賬業(yè)務(wù)代碼

@Override

public void transfer(String outMan, String inMan, double money) {

    accountDao.out(outMan,money);

    int i = 1/0;
 

   accountDao.in(inMan,money);

}

三、基于注解的聲明式事務(wù)控制

1、注解配置聲明式事務(wù)控制

1)編寫 AccoutDao

@Repository("accountDao")

public class AccountDaoImpl implements AccountDao {

    @Autowired

    private JdbcTemplate jdbcTemplate;

    public void out(String outMan, double money) {

        jdbcTemplate.update("update account set money=money-? where name=?",money,outMan);

    }

    public void in(String inMan, double money) {

        jdbcTemplate.update("update account set money=money+? where name=?",money,inMan);

    }

}

2)編寫 AccoutService

@Service("accountService")

@Transactional

public class AccountServiceImpl implements AccountService {

    @Autowired

    private AccountDao accountDao;

    @Transactional(isolation = Isolation.READ_COMMITTED,propagation = Propagation.REQUIRED)

    public void transfer(String outMan, String inMan, double money) {

        accountDao.out(outMan,money);

        int i = 1/0;

        accountDao.in(inMan,money);

    }

}

3)編寫 applicationContext.xml 配置文件

<!&mdash;之前省略datsSource、jdbcTemplate、平臺(tái)事務(wù)管理器的配置-->

<!--組件掃描-->

<context:component-scan base-package="com.itheima"/>

<!--事務(wù)的注解驅(qū)動(dòng)-->

<tx:annotation-driven/>

感謝各位的閱讀,以上就是“Spring聲明式事務(wù)控制是什么”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Spring聲明式事務(wù)控制是什么這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!

向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