国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術(shù)及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 詳解Spring學習之編程式事務管理

詳解Spring學習之編程式事務管理

2020-12-03 09:40顏洛濱 Java教程

本篇文章主要介紹了詳解Spring學習之編程式事務管理,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

前言

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

編程式事務管理

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

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

Spring配置文件

 
?
1
 
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?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>
 
  <!--配置事務管理-->
  <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <!--注入數(shù)據(jù)源-->
    <property name="dataSource" ref="dataSource"/>
  </bean>
  <!--配置事務管理操作類-->
  <bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
    <!--注入事務管理-->
    <property name="transactionManager" ref="transactionManager"/>
    <!--定義事務隔離級別,這里-1代表默認-->
    <property name="isolationLevel" value="-1"/>
    <!--配置傳播行為,0代表PROPAGATION_REQUIRED-->
    <property name="propagationBehavior" value="0"/>
    <!--由于進行讀寫操作,所以這里的只讀設置為false,默認也是false,所以可以不用設置-->
    <property name="readOnly" value="false"/>
  </bean>
</beans>

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

 
?
1
 
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 事務傳播行為
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;
 
// 事務隔離級別
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;

持久層代碼如下所示

 
?
1
 
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@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è)務層代碼如下所示

 
?
1
 
2
3
4
5
6
7
8
9
10
11
12
13
@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è)務層代碼進行檢查測試,可以看到,結(jié)果是沒有問題的,也就是轉(zhuǎn)賬是成功的

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

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

 
?
1
 
2
3
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)入,導致了有一部分金額莫名其妙丟失了,這也就是為什么需要進行事務管理了。

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

 
?
1
 
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@Service
public class AccountService {
 
  @Autowired
  private AccountDao accountDao;
 
  // 配置事務管理操作類
  @Autowired
  private TransactionTemplate transactionTemplate;
 
 
  public void transfer(final String fromName,final String toName,final double money){
 
    // 通過transactionTemplate進行事務的管理
    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ù)的一致性都得到了保證,這也就是說,事務管理起了作用

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

總結(jié)

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

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

原文鏈接:http://www.jianshu.com/p/4a716cf71007?utm_source=tuicool&utm_medium=referral

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 午夜视频在线观看免费视频 | 精品久 | 亚洲欧美另类久久久精品2019 | 精品久久久久一区二区国产 | 国产成人一区 | 亚洲精品在线视频 | 亚洲成人av一区二区 | 久久视频免费看 | 精品国产网站 | 久久久婷婷 | 免费国产一区二区 | 91精品国产综合久久福利软件 | 欧美精品一区二区三区中文字幕 | 欧美午夜一区二区三区免费大片 | 极品粉嫩饱满一线天在线 | 搞黄视频在线观看 | 国产视频精品免费 | 91亚洲精品一区 | 欧美一级二级三级视频 | 天天操人人干 | 天堂中文网 | 亚洲日韩成人 | 成人国产精品久久久 | 亚欧毛片 | 永久免费看黄网站 | 日韩av中文 | 日韩中文字幕一区二区三区 | 国产精品视频专区 | 国产日韩精品久久 | 俺去俺来也www色官网cms | 成人羞羞网站 | 欧美成人免费视频 | 国产色播av在线 | 中文字幕国产一区二区 | 亚洲视频精品在线 | 欧美极品视频 | 亚洲国产精品久久久 | 精品久久久久久久久久久下田 | 精品视频一区二区三区 | 欧美成人高清视频 | 伊人婷婷 |