最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Spring學(xué)習(xí)之編程式事務(wù)管理

 更新時間:2017年07月17日 11:36:07   作者:顏洛濱  
本篇文章主要介紹了詳解Spring學(xué)習(xí)之編程式事務(wù)管理,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

前言

在前面的內(nèi)容,基本已經(jīng)學(xué)習(xí)了事務(wù)的基本概念以及事務(wù)隔離級別等,接下來的幾個小節(jié),將學(xué)習(xí)怎么使用Spring進(jìn)行事務(wù)管理,在Spring中,對事務(wù)進(jìn)行管理有多種方法,主要分別編程式和聲明式,本小節(jié)主要學(xué)習(xí)編程式事務(wù)管理,后面講學(xué)習(xí)Spring的聲明式事務(wù)管理

編程式事務(wù)管理

所謂的編程式事務(wù)管理,其實就是通過編寫代碼的方式來進(jìn)行事務(wù)管理,也就是通過將事務(wù)管理的代碼硬編碼在代碼中從而達(dá)到事務(wù)管理的作用,不過Spring的事務(wù)管理不同于JDBC原始的事務(wù)管理,在JDBC中,對事務(wù)進(jìn)行管理首先要關(guān)閉自動提交,然后采用手動配置的方式來控制提交以及異常時回滾,而在Spring中,主要是使用Spring的接口來管理,具體如下代碼所示

這里模擬銀行轉(zhuǎn)賬的業(yè)務(wù),正如我們所知道的,轉(zhuǎn)賬其實就是從一個賬號減去金額并且給另外一個賬號增加對應(yīng)的金額

Spring配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    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.xsd">

   <!--開啟自動掃描-->
  <context:component-scan base-package="cn.xuhuanfeng.transaction"/>

  <!--配置數(shù)據(jù)源,這里采用dbcp-->
  <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="url" value="jdbc:mysql://localhost:3306/spring"/>
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="username" value="root"/>
    <property name="password" value="huanfeng"/>
  </bean>

  <!--配置JdbcTemplate-->
  <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <!--注入數(shù)據(jù)源-->
    <property name="dataSource" ref="dataSource"/>
  </bean>

  <!--配置事務(wù)管理-->
  <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <!--注入數(shù)據(jù)源-->
    <property name="dataSource" ref="dataSource"/>
  </bean>
  <!--配置事務(wù)管理操作類-->
  <bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
    <!--注入事務(wù)管理-->
    <property name="transactionManager" ref="transactionManager"/>
    <!--定義事務(wù)隔離級別,這里-1代表默認(rèn)-->
    <property name="isolationLevel" value="-1"/>
    <!--配置傳播行為,0代表PROPAGATION_REQUIRED-->
    <property name="propagationBehavior" value="0"/>
    <!--由于進(jìn)行讀寫操作,所以這里的只讀設(shè)置為false,默認(rèn)也是false,所以可以不用設(shè)置-->
    <property name="readOnly" value="false"/>
  </bean>
</beans>

在配置事務(wù)隔離級別的時候,由于這里是采用整數(shù)的形式,而不是字符串,一開始在配置的時候有點摸不著頭腦,后來查看了對應(yīng)的源代碼之后,發(fā)現(xiàn)了對應(yīng)的常量,將其記錄如下

  // 事務(wù)傳播行為
  int PROPAGATION_REQUIRED = 0;
  int PROPAGATION_SUPPORTS = 1;
  int PROPAGATION_MANDATORY = 2;
  int PROPAGATION_REQUIRES_NEW = 3;
  int PROPAGATION_NOT_SUPPORTED = 4;
  int PROPAGATION_NEVER = 5;
  int PROPAGATION_NESTED = 6;

  // 事務(wù)隔離級別
  int ISOLATION_DEFAULT = -1;
  int ISOLATION_READ_UNCOMMITTED = 1;
  int ISOLATION_READ_COMMITTED = 2;
  int ISOLATION_REPEATABLE_READ = 4;
  int ISOLATION_SERIALIZABLE = 8;
  int TIMEOUT_DEFAULT = -1;

持久層代碼如下所示

@Repository
public class AccountDao {

  @Autowired
  private JdbcTemplate jdbcTemplate;

  public void transferIn(String name, double money){
    String sql = "update account set money = money + ? where name = ?";

    jdbcTemplate.update(sql, money, name);
  }

  public void transferOut(String name, double money){
    String sql = "update account set money = money - ? where name = ?";

    jdbcTemplate.update(sql, money, name);
  }
}

業(yè)務(wù)層代碼如下所示

@Service
public class AccountService {

  @Autowired
  private AccountDao accountDao;

  // 轉(zhuǎn)賬
  public void transfer(String fromName, String toName, double money){

    accountDao.transferOut(fromName, money);
    accountDao.transferIn(toName, money);
  }
}

對業(yè)務(wù)層代碼進(jìn)行檢查測試,可以看到,結(jié)果是沒有問題的,也就是轉(zhuǎn)賬是成功的

如果此時在業(yè)務(wù)代碼執(zhí)行過程中發(fā)生錯誤或者異常,那么結(jié)果會是如何呢

比如說,通過修改transfer代碼,手動模擬異常,如下所示

  accountDao.transferOut(fromName, money);
  int d = 1/0; // 除0異常
  accountDao.transferIn(toName, money);

此時運行測試代碼,可以發(fā)現(xiàn),數(shù)據(jù)出現(xiàn)了不一致,金額已經(jīng)轉(zhuǎn)出了,但是由于在轉(zhuǎn)入之前發(fā)生了異常,所以無法轉(zhuǎn)入,導(dǎo)致了有一部分金額莫名其妙丟失了,這也就是為什么需要進(jìn)行事務(wù)管理了。

對業(yè)務(wù)層代碼添加事務(wù)管理,如下所示

@Service
public class AccountService {

  @Autowired
  private AccountDao accountDao;

  // 配置事務(wù)管理操作類
  @Autowired
  private TransactionTemplate transactionTemplate;


  public void transfer(final String fromName,final String toName,final double money){

    // 通過transactionTemplate進(jìn)行事務(wù)的管理
    transactionTemplate.execute(new TransactionCallbackWithoutResult() {
      @Override
      protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {
        accountDao.transferOut(fromName, money);
        int d = 1/0; // 除0異常
        accountDao.transferIn(toName, money);
      }
    });

  }
}

此時再運行代碼,可以發(fā)現(xiàn),不管是有沒有異常,數(shù)據(jù)的一致性都得到了保證,這也就是說,事務(wù)管理起了作用

上面的內(nèi)容就是使用Spring進(jìn)行事務(wù)管理的一種方式,不過這種方式是不太方便的,因為除了要配置事務(wù)管理操作類,也就是TransactionTemplate之外,當(dāng)需要進(jìn)行事務(wù)管理的時候,還需要在對應(yīng)的代碼中為其編寫相應(yīng)的管理代碼,如上所示,所以這種方式在日常的開發(fā)中比較少使用。

總結(jié)

本小節(jié)我們主要學(xué)習(xí)了如何在Spring配置事務(wù)管理器,并且通過編碼的方式,使用Spring的編程式事務(wù)管理對業(yè)務(wù)操作進(jìn)行事務(wù)管理,不過這種方式使用起來不是很方便,所以使用的頻率非常少,接下來的小節(jié)我們將學(xué)習(xí)Spring的聲明式事務(wù)管理。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Springboot之如何統(tǒng)計代碼執(zhí)行耗時時間

    Springboot之如何統(tǒng)計代碼執(zhí)行耗時時間

    這篇文章主要介紹了Springboot之如何統(tǒng)計代碼執(zhí)行耗時時間問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Nacos+Spring Cloud Gateway動態(tài)路由配置實現(xiàn)步驟

    Nacos+Spring Cloud Gateway動態(tài)路由配置實現(xiàn)步驟

    Nacos最近項目一直在使用,本文通過gateway、nacos-consumer、nacos-provider三個簡單模塊來展示:Nacos下動態(tài)路由配置,,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Java JDK動態(tài)代理在攔截器和聲明式接口中的應(yīng)用小結(jié)

    Java JDK動態(tài)代理在攔截器和聲明式接口中的應(yīng)用小結(jié)

    Java動態(tài)代理技術(shù)通過反射機制在運行時動態(tài)生成代理類,實現(xiàn)對目標(biāo)對象方法的攔截和增強,本文給大家介紹Java JDK動態(tài)代理在攔截器和聲明式接口中的應(yīng)用小結(jié),感興趣的朋友跟隨小編一起看看吧
    2025-01-01
  • 深入解析Java中的編碼轉(zhuǎn)換以及編碼和解碼操作

    深入解析Java中的編碼轉(zhuǎn)換以及編碼和解碼操作

    這篇文章主要介紹了Java中的編碼轉(zhuǎn)換以及編碼和解碼操作,文中詳細(xì)解讀了編碼解碼的相關(guān)IO操作以及內(nèi)存使用方面的知識,需要的朋友可以參考下
    2016-02-02
  • 分布式消息隊列RocketMQ概念詳解

    分布式消息隊列RocketMQ概念詳解

    RocketMQ?是阿里開源的分布式消息中間件,跟其它中間件相比,RocketMQ?的特點是純JAVA實現(xiàn),是一套提供了消息生產(chǎn),存儲,消費全過程API的軟件系統(tǒng),本文詳細(xì)介紹了分布式消息隊列RocketMQ概念,需要的朋友可以參考下
    2023-05-05
  • Windows系統(tǒng)安裝JDK小結(jié)

    Windows系統(tǒng)安裝JDK小結(jié)

    這篇文章主要給大家詳細(xì)介紹了Windows系統(tǒng)安裝JDK的方法和步奏,十分的細(xì)致,有需要的小伙伴可以參考下
    2016-03-03
  • Java基礎(chǔ)之Maven詳解

    Java基礎(chǔ)之Maven詳解

    這篇文章主要介紹了Java基礎(chǔ)之Maven詳解,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • 如何通過ServletInputStream讀取http請求傳入的數(shù)據(jù)

    如何通過ServletInputStream讀取http請求傳入的數(shù)據(jù)

    這篇文章主要介紹了如何通過ServletInputStream讀取http請求傳入的數(shù)據(jù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • maven如何動態(tài)統(tǒng)一修改版本號的方法步驟

    maven如何動態(tài)統(tǒng)一修改版本號的方法步驟

    這篇文章主要介紹了maven如何動態(tài)統(tǒng)一修改版本號的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Springboot使用POI實現(xiàn)導(dǎo)出Excel文件示例

    Springboot使用POI實現(xiàn)導(dǎo)出Excel文件示例

    本篇文章主要介紹了Springboot使用POI實現(xiàn)導(dǎo)出Excel文件示例,非常具有實用價值,需要的朋友可以參考下。
    2017-02-02

最新評論

广丰县| 安岳县| 青阳县| 吉安市| 湘西| 新丰县| 商洛市| 深州市| 涞水县| 曲阜市| 淳安县| 彰化县| 兴隆县| 余庆县| 囊谦县| 深泽县| 涪陵区| 吉林市| 芦山县| 伊吾县| 诸城市| 清徐县| 玉林市| 高尔夫| 太仆寺旗| 徐闻县| 思南县| 历史| 瑞昌市| 肃宁县| 息烽县| 绥滨县| 同仁县| 定陶县| 霍邱县| 凉城县| 开封市| 泾源县| 汉川市| 桑日县| 林甸县|