• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • Spring事務管理

    標簽: spring  事務管理

    Spring 事務管理機制

    事務的概念和特性

    事務:一起成功、一起失敗

    什么是事務呢?

    事務指的是邏輯上的一組操作,這組操作要么全部成功,要么全部失敗

    事務的特性:

    原子性、一致性、隔離性、持久性

    原子性:原子性是值事務是一個不可分割的工作單位,事務中的操作要么都發生,要么都不發生

    一致性:一致性指事務前后數據的完整性必須保持一致

    隔離性:隔離性是指多個用戶并發訪問數據庫時,一個用戶的事務不能被其他用戶的事務所干擾,多個并發事務之間數據要相互隔離。

    持久性:一個事務一旦被提交,它對數據庫中數據的改變就是永久性的,即使數據庫發生故障也不應該對其有任何影響。

    如果不考慮隔離性,會引發安全問題如下:

    臟讀、不可重復讀、幻讀

    臟讀:一個事務讀取了另一個事務改寫但還未提交的數據,如果這些數據被回滾,則讀到的數據是無效的。

    不可重復讀:在同一事務中,多次讀取同一數據返回的結果有所不同。

    幻讀:一個事務讀取了幾行記錄后,另一個事務插入一些記錄,幻讀就發生了,再后來的查詢中,第一個數據就會發現有些原來沒有的記錄

    Spring接口介紹

    Spring事務管理高層首相主要包括三個接口

    PlatformTransactionManager

    平臺事務管理器

    TransactionDefinition

    事務定義信息(隔離、傳播、超時、只讀)

    TransactionStatus

    事務具體運行狀態

    平臺事務管理器

    http://ov1a6etyz.bkt.clouddn.com//15094422425335962e81e000113e312800720.jpg

    事務的四種隔離級別

    http://ov1a6etyz.bkt.clouddn.com//150944206092159f71a160001178612800720.jpg

    MySql默認的事務隔離級別為REPEATABLE_READ
    Oracle默認的事務隔離級別為READ_COMMITTED

    spring 事務的七種傳播行為

    什么是事務的傳播行為?

    http://ov1a6etyz.bkt.clouddn.com//150949928102259c31b1b000123d712800720.jpg

    事務有哪些傳播行為?

    http://ov1a6etyz.bkt.clouddn.com//150944240857759eee1ff0001bb2c12800720.jpg

    重點記第一個PROPAGATION_REQUIRED、第四個PROPAGATION_REQUIRES_NEW、和最后一個PROPAGATION_NESTED

    Spring事務管理

    Spring支持兩種方式

    1.編程式的事務

    在實際應用中很少使用

    通過TransactionTemplate手動管理事務

    2.使用xml配置聲明式事務

    開發中推薦使用(代碼侵入性最小)

    Spring的聲明式事務是通過AOP實現的

    Spring事務管理的實現

    描述:在ssm環境下,以簡單的轉賬案例,分別使用編程式事務管理、以及聲明式事務管理來實現Spring事務管理。

    創建數據庫表

    CREATE TABLE `account` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(20) NOT NULL,
      `money` double DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
    INSERT INTO `account` VALUES ('1', 'aaa', '1000');
    INSERT INTO `account` VALUES ('2', 'bbb', '1000');
    INSERT INTO `account` VALUES ('3', 'ccc', '1000');

    編寫AccountDaO層

    package com.mavenssmlr.dao;
    
    import org.apache.ibatis.annotations.Param;
    
    /**
     * 轉賬案例的Dao層的接口
     * Created by shirukai on 2017/11/1.
     */
    public interface AccountDao {
        /**
         *
         * @param out   轉出賬號
         * @param money 轉出金額
         */
        public void outMoney(@Param("out") String out,@Param("money") Double money);
    
        /**
         *
         * @param in    轉入賬號
         * @param money 轉入金額
         */
        public void inMoney(@Param("in") String in,@Param("money") Double money);
    }

    編寫 AccountDaoMappper

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.mavenssmlr.dao.AccountDao">
        <update id="outMoney">
            UPDATE mavenssmlr.account SET money = money - #{money} WHERE name = #{out}
        </update>
        <update id="inMoney">
            UPDATE mavenssmlr.account SET money = money+ #{money} WHERE name = #{in}
        </update>
    </mapper>

    編寫Service接口

    /**
     * 轉賬案例的業務接口
     * @param out   轉出的賬號
     * @param in    轉入的賬號
     * @param money 轉賬金額
     */
    Map<String,String> transfer(String out ,String in ,Double money);

    編寫Service接口實現類

    public Map<String, String> transfer(String out, String in, Double money) {
        accountDao.outMoney(out, money);
        accountDao.inMoney(in, money);
        return null;
    }

    編寫service測試類

    @Test
    public void accountTest()throws Exception{
        mavenssmlrService.transfer("aaa","bbb",200d);
    }

    以上基本的轉賬案例就寫完了,但是沒有加入事務管理。

    一、基于編程式的事務管理

    Spring-service.xml

    配置事務管理器
    <!--配置事務管理器-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!--注入數據庫連接池-->
        <property name="dataSource" ref="dataSource"/>
    </bean>
    
    配置事務管理模板
    <!--配置事務管理的模板:Spring為了簡化事務管理的代碼而提供的類-->
    <bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
        <property name="transactionManager" ref="transactionManager"/>
    </bean>

    service實現類

    注入編程事務模板
    //注入編程式事務模板
    @Autowired
    private TransactionTemplate transactionTemplate;
    編程式事務方法
    public Map<String, String> transfer(final String out,final String in,final Double money) {
        transactionTemplate.execute(new TransactionCallbackWithoutResult() {
            @Override
            protected void doInTransactionWithoutResult(TransactionStatus status) {
                accountDao.outMoney(out, money);
                //制造異常
                int i = 1 / 0;
                accountDao.inMoney(in, money);
            }
        });
        return null;
    }
    測試類 無需改動
    @Test
    public void accountTest()throws Exception{
        mavenssmlrService.transfer("aaa","bbb",200d);
    }

    二、基于聲明式的事務管理

    1.基于TransactionProxy的聲明式事務管理

    Spring-service.xml

    配置事務管理器
    <!--配置事務管理器-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!--注入數據庫連接池-->
        <property name="dataSource" ref="dataSource"/>
    </bean>
    配置業務代理
    <!--配置業務代理:-->
    <bean id="accountServiceProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
        <!--配置目標對象-->
        <property name="target" ref="mavenssmlrServiceImpl"/>
        <!--注入事務管理器-->
        <property name="transactionManager" ref="transactionManager"/>
        <!--注入事務屬性-->
        <property name="transactionAttributes">
            <props>
                <!--prop的格式
                        * PROPAGATION :事務的傳播行為
                        * ISOLATION   :事務的隔離級別
                        * readOnly    :只讀
                        * -Exception  :發生哪些異常回滾事務
                        * +Exception  :發生哪些以上不回滾事務
                -->
                <prop key="transfer">PROPAGATION_REQUIRED</prop>
            </props>
        </property>

    service實現類

    public Map<String, String> transfer(String out, String in, Double money) {
        accountDao.outMoney(out, money);
        //制造異常
        int i = 1 / 0;
        accountDao.inMoney(in, money);
        return null;
    }
    測試類 需要引入Service的增強類
    @Resource(name = "accountServiceProxy")
    private MavenssmlrService mavenssmlrService;
    
    @Test
    public void accountTest()throws Exception{
        mavenssmlrService.transfer("aaa","bbb",200d);
    }

    2.基于AspectJ的xml配置聲明式事務(沒有實現)

    
    <!--配置事務管理器-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!--注入數據庫連接池-->
        <property name="dataSource" ref="dataSource"/>
    </bean>
    
    
    <!--2)配置事務的通知(事務的增強)-->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <!--
                propagation    :事務傳播行為
                isolation  :事務的隔離級別
                read-only  :只讀
                rollback-for:發生哪些異常回滾
                no-rollback-for    :發生哪些異常不回滾
                timeout       :過期信息
             -->
            <tx:method name="transfer" propagation="REQUIRED"/>
        </tx:attributes>
    </tx:advice>
    
    <!-- 配置切面 -->
    <aop:config>
        <!-- 配置切入點 -->
        <aop:pointcut expression="execution(* com.mavenssmlr.service.MavenssmlrService+.*(..))" id="pointcut1"/>
        <!-- 配置切面 -->
        <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut1"/>
    </aop:config>

    3.基于注解的聲明式事務

    Spring-service.xml

    
    <!--配置事務管理器-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!--注入數據庫連接池-->
        <property name="dataSource" ref="dataSource"/>
    </bean>
    
    <!--2配置基于注解的聲明式事務-->
    <tx:annotation-driven transaction-manager="transactionManager"/>

    在方法上添加@Transactional

    /**
     * 
     * @param out   轉出的賬號
     * @param in    轉入的賬號
     * @param money 轉賬金額
     * @return
     * 
     * Transactional注解中的屬性
     * propagation:事務的傳播行為
     * isolation:隔離基本
     * readOnly:只讀信息
     * rollbackFor:發生哪些異常回滾
     * noRollbackFor:發生哪些異常不回滾
     */
    @Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.DEFAULT,readOnly = false)
    public Map<String, String> transfer(String out, String in, Double money) {
        accountDao.outMoney(out, money);
        //制造異常
        int i = 1 / 0;
        accountDao.inMoney(in, money);
        return null;
    }

    總結:

    Spring將事務管理分成了兩類

    • 編程式事務管理

      手動編寫代碼進行事務管理(很少使用)

    • 聲明式事務管理

      基于TransactionProxyFactoryBean(很少使用)

      基于AspectJ的XMl方式

      基于注解方式(經常使用)

      ?

    版權聲明:本文為shirukai原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/shirukai/article/details/81025594

    智能推薦

    Spring 事務管理

    案例—轉賬操作 創建一個關于轉賬的帳戶表 創建service與dao 對于數據的操作使用spring jdbc template Service層和Dao層代碼 Dao接口 Dao實現類 Service接口 Service實現類 測試類 service與dao的配置 數據庫配置文件db.properties 我們讓dao去extends JdbcDaoSupport類,這個類中它創建了...

    Spring 事務管理

    1.事務(編程式事務)(聲明式事務) 1.什么是事務? 把一組業務當做一個事務來做,要么成功,要么失敗!事務在項目開發中,十分重要,涉及到數據的一致性問題和完整性 2.事務ACID原則 原子性 一致性 隔離性:多個可能操作同一個資源,防止數據損壞 持久性:事務一旦提交,無論系統發生什么問題,結果都不會被影響,被持久化的寫到存儲器中 2 Spring中的事務管理 聲明式事務:AOP 編程式事務:需要...

    Spring 事務管理

    事務管理接口   編程式事務管理(基于Java編程控制,很少使用) 利用TransactionTemplate將多個DAO操作封裝起來 聲明式事務管理(基于Spring的AOP配置控制)        基于TransactionProxyFactoryBean的方式.(很少使用) 需要為每個進行事務管理的類,配置一個Transa...

    Spring 事務管理

    一、spring的事務管理 1.事物的概念: 事務管理是企業級應用程序開發中必不可少的技術, 用來確保數據的完整性和一致性。 事務就是一系列的動作, 它們被當作一個單獨的工作單元. 這些動作要么全部完成, 要么全部不起作用。 2.事務的屬性 事務的4個屬性:原子性、一致性、隔離性、持久性。這四個屬性通常稱為ACID特性。 原子性(atomicity): 事務是一個原子操作, 由一系列動作組成. 事...

    Spring 事務管理

    事務實現方式 在Spring中,事務有兩種實現方式,分別是編程式事務管理和聲明式事務管理兩種方式。 編程式事務管理: 編程式事務管理使用TransactionTemplate或者直接使用底層的PlatformTransactionManager。對于編程式事務管理,spring推薦使用TransactionTemplate。 聲明式事務管理: 建立在AOP之上的。其本質是對方法前后進行攔截,然后在...

    猜你喜歡

    Spring事務管理

    事務 就是把一系列的動作當成一個獨立的工作單元,這些動作要么全部完成,要么全部不起作用。 事務四個屬性ACID 原子性(atomicity) 事務是原子性操作,由一系列動作組成,事務的原子性確保動作要么全部完成,要么完全不起作用 一致性(consistency) 一旦所有事務動作完成,事務就要被提交。數據和資源處于一種滿足業務規則的一致性狀態中 隔離性(isolation) 可能多個事務會同時處理...

    Spring:事務管理

    文章目錄 2、事務管理 1、事務的隔離級別? 1、事務概念 2、事務的四大特性 3、事務的隔離級別 2、Spring 事務的傳播行為? 1、接口介紹 2、事務的傳播特性 3、Spring業務層不使用事務 4、Spring編程式事務 5、Spring聲明式事務 1、基于TransactionProxyFactoryBean的方式 2、基于Aspetj的xml方式 3、基于注解的方式 2、事務管理 1...

    spring事務管理

    spring事務管理的兩種方式 第一種,編程式事務管理 第二種,聲明式事務管理 基于xml配置文件實現 基于注解實現 spring事務管理的api 接口:PlatformTransactionManager事務管理器 - 針對不同的dao層的框架,提供了這個接口不同的實現類 - 首先要配置事務管理器 轉賬案例 dao層 service層: 如果沒有事務管理,a賬戶余額減少,但是b賬戶余額并沒有增加...

    Spring 事務管理

    事務的定義 事務是一個操作集合,這些操作要么都執行,要么都不執行,它是一個不可分割的工作單位。 事務的特性 在一個事務性操作的環境下,操作有著以下的4種特性,被稱為ACID特性: 原子性(Atomicity):當事務結束,它對所有資源狀態的改變都被視為一個操作,這些操作要不同時成功,要不同時失敗; 一致性(Consistency):操作完成后,所有數據必須符合業務規則,否則事務必須中止; 隔離性(...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    精品国产乱码久久久久久蜜桃不卡