1. 程式人生 > >Spring 框架基礎(05):事務管理機制,和實現方式

Spring 框架基礎(05):事務管理機制,和實現方式

本文原始碼:GitHub·點這裡 || GitEE·點這裡

一、Spring事務管理

1、基礎描述

Spring事務管理的本質就是封裝了資料庫對事務支援的操作,使用JDBC的事務管理機制,就是利用java.sql.Connection物件完成對事務的提交和回滾。

Connection conn = DriverManager.getConnection();
try {  
    // 自動提交設定為false
    conn.setAutoCommit(false);
    // 執行增刪改查操作
    // 當操作成功後手動提交
    conn.commit();  
} catch (Exception e) {
    // 出現異常,回滾所有操作
    conn.rollback();
    e.printStackTrace();
} finally {
    conn.colse();
}

2、事務常見概念

  • 事務

事務是指作為單個邏輯工作單元執行的一系列操作(SQL語句)。這些操作要麼全部成功,要麼全部不成功。

  • 特性:ACID
原子性(Atomicity):事務中的多個操作要麼都成功要麼都失敗
一致性(consistency):事務的執行的前後資料的完整性保持一致
隔離性(isolation):事務執行的過程中,不應該受到其他事務的干擾
永續性(durability):事務一旦結束,資料就持久到資料庫
  • 隔離問題

髒讀:一個事務讀到另一個事務沒有提交的資料

不可重複讀:一個事務前後多次讀取相同資料,資料內容不一致,update場景問題

虛讀(幻讀):一個事務前後多次讀取,資料總量不一致,insert場景問題

  • 隔離級別

read uncommitted:

事務可以讀取另一個未提交事務的資料。

read committed

事務要等另一個事務提交後才能讀取資料,解決髒讀。

repeatable read

在開始讀取資料時,事務開啟,不再允許修改操作,解決:髒讀、不可重複讀。

serializable

最高事務隔離級別,事務序列化順序執行,解決髒讀、不可重複讀、幻讀。但是效率低下,耗資料庫效能。

3、事務管理API描述

  • PlatformTransactionManager

平臺事務管理器,Spring管理事務,必須使用事務管理器進行事務配置時,核心方法:獲取事務,提交事務,回滾事務。

  • TransactionDefinition

該物件封裝事務詳情(事務定義、事務屬性),例如:隔離級別、是否只讀、超時時間 等。

  • TransactionStatus

用於記錄當前事務執行狀態。例如:是否有儲存點,事務是否完成。Spring底層根據狀態進行相應操作。

4、事務案例SQL語句

CREATE TABLE user_account(
  id INT PRIMARY KEY AUTO_INCREMENT,
  username VARCHAR(50),
  money INT
) ENGINE=InnoDB DEFAULT CHARSET=utf8;;
INSERT INTO user_account(username,money) VALUES('jack','5000');
INSERT INTO user_account(username,money) VALUES('tom','5000');
SELECT * FROM user_account ;

二、程式設計式事務管理

1、核心配置檔案

<!-- 配置事物管理器 -->
<bean id="txManager"
      class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>
<!-- 建立事物模板 -->
<bean id="transactionTemplate"
      class="org.springframework.transaction.support.TransactionTemplate">
    <property name="transactionManager" ref="txManager" />
</bean>
<!-- 配置轉賬介面 -->
<bean id="userAccountService"
      class="com.spring.mvc.service.impl.UserAccountServiceImpl">
    <property name="jdbcTemplate" ref="jdbcTemplate" />
    <property name="transactionTemplate" ref="transactionTemplate" />
</bean>

2、演示案例

@Service
public class UserAccountServiceImpl extends JdbcDaoSupport implements UserAccountService {
    // 注入事物模板
    private TransactionTemplate transactionTemplate ;
    public void setTransactionTemplate(TransactionTemplate transactionTemplate) {
        this.transactionTemplate = transactionTemplate;
    }
    @Override
    public void remittance(String remitTer, String receiver, int money) {
        transactionTemplate.execute(new TransactionCallbackWithoutResult() {
            public void doInTransactionWithoutResult(TransactionStatus arg0) {
                outMoney(remitTer,money);
                // System.out.println(1/0);
                innerMoney(receiver,money);
            }
        });
    }
    private void outMoney (String remitTer, int money){
        String outSql = "update user_account set money = money - ? where username = ?";
        this.getJdbcTemplate().update(outSql, money ,remitTer);
    }
    private void innerMoney (String receiver, int money){
        String inSql = "update user_account set money = money + ? where username = ?";
        this.getJdbcTemplate().update(inSql, money,receiver);
    }
}

三、事務代理工廠

1、核心配置

<!-- 配置轉賬介面 -->
<bean id="userAccountService01"
      class="com.spring.mvc.service.impl.UserAccountServiceImpl01">
    <property name="jdbcTemplate" ref="jdbcTemplate" />
</bean>
<!-- 配置事務代理工廠 -->
<bean id="proxyAccountService"
      class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    <property name="proxyInterfaces" value="com.spring.mvc.service.UserAccountService01" />
    <property name="target" ref="userAccountService01" />
    <property name="transactionManager" ref="txManager" />
    <property name="transactionAttributes">
        <props>
            <!-- 預設傳播行為、隔離級別 -->
            <prop key="remittance">PROPAGATION_REQUIRED,ISOLATION_DEFAULT</prop>
            <!-- 異常仍然提交事務
            <prop key="remittance">PROPAGATION_REQUIRED,ISOLATION_DEFAULT,+java.lang.Exception</prop>
            -->
        </props>
    </property>
</bean>

配置說明:

  • proxyInterfaces 代理介面
  • target 代理目標類
  • transactionManager 事務管理器
  • transactionAttributes 事務屬性(事務詳情)
  • prop.key 指定方法使用當前事務配置

事務行為:

  • PROPAGATION 傳播行為
  • ISOLATION 隔離級別
  • readOnly 是否只讀
  • -Exception 異常回滾
  • +Exception 異常提交

2、演示案例

@Service
public class UserAccountServiceImpl01 extends JdbcDaoSupport implements UserAccountService01 {
    @Override
    public void remittance(String remitTer, String receiver, int money) {
        outMoney(remitTer,money);
        System.out.println(1/0);
        innerMoney(receiver,money);
    }
    private void outMoney (String remitTer, int money){
        String outSql = "update user_account set money = money - ? where username = ?";
        this.getJdbcTemplate().update(outSql, money ,remitTer);
    }
    private void innerMoney (String receiver, int money){
        String inSql = "update user_account set money = money + ? where username = ?";
        this.getJdbcTemplate().update(inSql, money,receiver);
    }
}

3、測試程式碼

public class Tx_Test_02 {
    @Test
    public void test1 (){
        String xmlPath = "spring-jdbc-tx-02.xml";
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(xmlPath);
        UserAccountService01 accountService = (UserAccountService01)
                                    context.getBean("proxyAccountService");
        accountService.remittance("jack","tom",1000);
    }
}

四、XML配置事務

首先配置事務管理器,然後配置事務屬性,最後基於AOP程式設計配置事務切入點。

1、核心配置

<!-- 配置事物管理器 -->
<bean id="txManager"
      class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>
<!-- 配置轉賬介面 -->
<bean id="userAccountService01"
      class="com.spring.mvc.service.impl.UserAccountServiceImpl01">
    <property name="jdbcTemplate" ref="jdbcTemplate" />
</bean>
<!-- 配置事物詳情 -->
<tx:advice id="txAdvice" transaction-manager="txManager">
    <tx:attributes>
        <tx:method name="remittance"
                   propagation="REQUIRED"
                   isolation="DEFAULT"/>
    </tx:attributes>
</tx:advice>
<!-- 事務切入點,基於AOP程式設計 -->
<aop:config>
    <aop:advisor
         advice-ref="txAdvice"
         pointcut="execution(* com.spring.mvc.service.UserAccountService01.*(..))"/>
</aop:config>

五、基於事務註解

配置事務管理器,並啟動事務註解的支援,在目標類或目標方法新增@Transactional核心註解即可。

1、核心配置

<!-- 配置事物管理器 -->
<bean id="txManager"
      class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>
<!-- 支援事務註解 -->
<tx:annotation-driven transaction-manager="txManager" />

2、註解用法

註解寫在介面方法上,或者介面實現的方法上效果一樣。

public interface UserAccountService02 {
    @Transactional(rollbackFor = Exception.class)
    void remittance(String remitTer, String receiver, int money) ;
}

六、原始碼地址

GitHub·地址
https://github.com/cicadasmile/spring-mvc-parent
GitEE·地址
https://gitee.com/cicadasmile/spring-mvc-parent

相關推薦

Spring 框架基礎(05)事務管理機制實現方式

本文原始碼:GitHub·點這裡 || GitEE·點這裡 一、Spring事務管理 1、基礎描述 Spring事務管理的本質就是封裝了資料庫對事務支援的操作,使用JDBC的事務管理機制,就是利用java.sql.Connection物件完成對事務的提交和回滾。 Connection conn = Drive

Spring 框架基礎(01)核心元件總結基礎環境搭建

本文原始碼:GitHub·點這裡 || GitEE·點這裡 一、Spring框架 1、框架簡介 Spring是一個開源框架,框

SSHSpring框架(宣告式事務管理詳解)

1) 概念:事務 (Transaction) 是訪問並可能更新資料庫中各種資料項的一個程式執行單元 (unit) 。事務通常由高階資料 庫操縱語言或程式語言 (如 SQL , C++ 或 Java ) 書寫的使用者程式的執行所引起, 並用形如 begin transacti

Spring Boot 2.x基礎教程事務管理入門

## 什麼是事務? 我們在開發企業應用時,通常業務人員的一個操作實際上是對資料庫讀寫的多步操作的結合。由於資料操作在順序執行的過程中,任何一步操作都有可能發生異常,異常會導致後續操作無法完成,此時由於業務邏輯並未正確的完成,之前成功操作的資料並不可靠,如果要讓這個業務正確的執行下去,通常有實現方式: 1.

深入理解spring事務管理機制及程式碼實現

Spring的事務管理機制 Spring事務管理高層抽象主要包括3個介面,Spring的事務主要是由他們共同完成的: PlatformTransactionManager:事務管理器—主要用於平臺相關事務的管理 TransactionDefinition: 事務定義資訊(隔

深入學習Spring框架(四)- 事務管理

1.什麼是事務?   事務(Transaction)是一個操作序列。這些操作要麼都做,要麼都不做,是一個不可分割的工作單位,是資料庫環境中的邏輯工作單位。事務是為了保證資料庫的完整性。例如:A給B轉賬,需要先減掉A的賬戶餘額再加到B的賬戶上,這兩個操作是一個整體,不可能扣掉A的錢不給B加上,或者只給B加沒有

Spring 框架基礎(03)核心思想 IOC 說明案例演示

本文原始碼:GitHub·點這裡 || GitEE·點這裡 一、IOC控制反轉 1、IOC容器思想 Java系統中物件耦合關係

Spring 框架基礎(02)Bean的生命週期作用域裝配總結

本文原始碼:GitHub·點這裡 || GitEE·點這裡 一、裝配方式 Bean的概念:Spring框架管理的應用程式中,由

Spring 框架基礎(06)Mvc架構模式簡介執行流程詳解

本文原始碼:GitHub·點這裡 || GitEE·點這裡 一、SpringMvc框架簡介 1、Mvc設計理念 MVC是一種軟體設計典範,用一種業務邏輯、資料、介面顯示分離的方法組織程式碼,將業務邏輯聚集到一個元件裡面,在改進和個性化定製介面及使用者互動的同時,不需要重新編寫業務邏輯,MVC分層有助於管理和架

基於Spring框架應用的許可權控制系統的研究實現

摘 要: Spring框架是一個優秀的多層J2EE系統框架,Spring本身沒有提供對系統的安全性支援。Acegi是基於Spring IOC 和 AOP機制實現的一個安全框架。本文探討了Acegi安全框架中各部件之間的互動,並通過擴充套件Acegi資料庫設計來實現基於Spring框架的應用的安全控制方法。

限界分支法(實際上沒有剪枝介紹的是廣度優先搜尋)01揹包問題佇列實現方式(FIFO)

限界分支法:佇列實現方式 前面已經介紹過限界分支法大部分是基於廣度優先搜尋,廣度優先搜尋一般藉助於佇列實現,剪枝的情況可以藉助於優先順序佇列。 實現如下: #%% class FIFO_01_Pack: def __init__(self,N,V,C,W):

Java進階學習第二十四天(Spring框架事務管理Spring與Hibernate整合)

一、事務控制 1、引入 使用者訪問 > Action > Service > Dao 如何保證: 在service中呼叫2次dao,其中一個dao執行失敗,整個操作要回滾 2、事務控制概述 ① 程式設計式事務控制:自己手動控制事務 Jdbc程式

MySQL基礎篇(06)事務管理機制案例詳解

本文原始碼:[GitHub·點這裡](https://github.com/cicadasmile/mysql-data-base) || [GitEE·點這裡](https://github.com/cicadasmile/mysql-data-base) # 一、鎖概念簡介 ## 1、基礎描述 鎖

Spring事務管理機制入門(一)

黑馬程式設計師Spring事務管理機制視訊學習筆記,視訊教程的內容用來入門,為了深入掌握,後面會對學習的內容進行原始碼解析、設計思想剖析、事務的本質的探索、對生活和人生的啟示一一道來,爭取做到,學就要學透,不要為了學習而學習。   Spring事務管理機制 主要內容:

第三天 事務管理 、 三大框架整合開發

事務管理 、 三大框架整合開發 目錄 一、Spring事務管理 1、 事務管理相關API 2、 PlatformTransactionManager 介面詳解 1) 不同平臺事務管理器實現 2) TransactionDefinition 事務隔離級別 3)

[轉]Spring 事務管理機制

摘要:    一般地,使用者的每次請求都對應一個業務邏輯方法,而一個業務邏輯方法往往包括一系列資料庫原子訪問操作,並且這些資料庫原子訪問操作應該繫結成一個事務來執行。然而,在使用傳統的事務程式設計策略時,程式程式碼必然和具體的事務操作程式碼耦合,而使

8.spring事務管理(上):Spring的資料庫程式設計、程式設計式事務管理

Spring的資料庫程式設計  Spring框架提供了JDBC模板模式------>JdbcTemplate 簡化了開發,在開發中並不經常是使用 實際開發更多使用的是Hibernate和MyBatis 1).Spring JDBCp配置 如果使用Spring JDBC操作資料庫,要有

9.spring事務管理(下):宣告式事務管理

宣告式事務管理  sprin的宣告式事務是管理AOP技術實現的事務管理,其本質是是對方法前後進行攔截,然後 在目標方法開始之前建立或者加入一個事務,在執行完成目標方法之後根據執行情況提交或者回滾事務。   宣告式事務管理優點:不需要通過程式設計的方式管理事務,因而不需要在業務邏輯程

Spring事務管理機制實現原理-動態代理

之前在做專案中遇到spring無法進行事務代理問題,最後發現是因為沒有寫介面,原因當時明白了,看到這篇文章寫的清楚些,轉過來  我們先來分析一下Spring事務管理機制的實現原理。由於Spring內建AOP預設使用動態代理模式實現,我們就先來分析一下動態代理模式的實現方 法。動態代理模式的核心就在於程

Spring4的知識應用總結(六)——Spring事務管理機制

Spring中的事務管理一、事務簡介        事務管理是企業級應用程式開發中必不可少的技術,  用來確保資料的完整性和一致性. 事務就是一系列的動作, 它們被當做一個單獨的工作單元. 這些動作要麼