1. 程式人生 > >Spring事務管理(轉賬例子)

Spring事務管理(轉賬例子)

搭建轉賬環境

1、建立資料庫,新增資料


2、 建立service和dao類,完成注入關係


(1)service層又叫業務邏輯層


(2)dao層,單純對資料庫操作層,在dao層不新增業務


(3)需求:Jerry 轉賬 300 給 Tom

- Jerry 少 300

- Tom 多 300

詳細程式碼,見下面

3、解決問題

(1)如果 Jerry 轉出了 300 之後,出現異常(比如銀行停電之類的),Tom 不會多 300,錢丟失了

4、解決

(1)新增事務解決,出現異常進行回滾操作

宣告式事務管理(xml配置)

1、 配置檔案方式使用aop思想配置

第一步、 配置事務管理器


第二步、 配置事務增強


第三步 、配置切面


2、完整程式碼如下

  • AccountDao.java
  1. package com.liuyanzhao.spring.demo1;
  2. import org.springframework.jdbc.core.JdbcTemplate;
  3. /**
  4.  * Created by 言曌 on 2017/8/8.
  5.  */
  6. public class AccountDao {
  7.     //注入JdbcTemplate物件
  8.     private JdbcTemplate jdbcTemplate;
  9.     public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
  10.         this
    .jdbcTemplate = jdbcTemplate;
  11.     }
  12.     /**
  13.      * @param name      轉賬人
  14.      * @param money     轉賬金額
  15.      */
  16.     public void outMoney(String name,double money) {
  17.         String sql = "update account set money = money - ? where name = ?";
  18.         jdbcTemplate.update(sql,money,name);
  19.     }
  20.     /**
  21.      * @param name      收賬人
  22.      * @param money     收賬金額
  23.      */
  24.     public void inMoney(String name,double money) {
  25.         String sql = "update account set money = money + ? where name = ?";
  26.         jdbcTemplate.update(sql,money,name);
  27.     }
  28. }
  • AccountService.java
  1. package com.liuyanzhao.spring.demo1;
  2. /**
  3.  * Created by 言曌 on 2017/8/8.
  4.  */
  5. public class AccountService {
  6.     //注入ordersDao物件
  7.     private AccountDao accountDao;
  8.     public void setAccountDao(AccountDao accountDao) {
  9.         this.accountDao = accountDao;
  10.     }
  11.     /**
  12.      * @param Transfer_person   轉賬人
  13.      * @param account_holder    收賬人
  14.      * @param money             交易金額
  15.      */
  16.     public void accountMoney(String Transfer_person,String account_holder,double money) {
  17.         //轉賬
  18.         accountDao.outMoney(Transfer_person,money);
  19.         /**
  20.          * 假如,轉賬過程中,出現異常
  21.          * 如果我們不配置事務管理,會出現 轉賬成功,收賬失敗
  22.          * 如果我們配置了事務管理,兩者必然是同時成功,同時失敗
  23.          */
  24.         //int i = 10/0;
  25.         //收賬
  26.         accountDao.inMoney(account_holder,money);
  27.     }
  28. }
  • applicationContext.xml   配置檔案
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.        xmlns:context="http://www.springframework.org/schema/context"
  5.        xmlns:aop="http://www.springframework.org/schema/aop"
  6.        xmlns:tx="http://www.springframework.org/schema/tx"
  7.        xsi:schemaLocation="http://www.springframework.org/schema/beans
  8.     http://www.springframework.org/schema/beans/spring-beans.xsd
  9.     http://www.springframework.org/schema/context
  10.     http://www.springframework.org/schema/context/spring-context.xsd
  11.     http://www.springframework.org/schema/aop
  12.     http://www.springframework.org/schema/aop/spring-aop.xsd
  13.     http://www.springframework.org/schema/tx
  14.     http://www.springframework.org/schema/tx/spring-tx.xsd">
  15.     <context:component-scan base-package="com.liuyanzhao.spring.demo1"/>
  16.     <!-- 引入外部屬性檔案 -->
  17.     <context:property-placeholder location="classpath:jdbc.properties"/>
  18.     <!-- 配置C3P0連線池 -->
  19.     <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
  20.         <property name="driverClass" value="${jdbc.driverClass}"/>
  21.         <property name="jdbcUrl" value="${jdbc.url}"/>
  22.         <property name="user" value="${jdbc.username}"/>
  23.         <property name="password" value=""/>
  24.     </bean>
  25.     <!--
  26.         id值可以隨便寫,與ref對應;
  27.         name值 是 類中的要注入的屬性
  28.     -->
  29.     <bean id="accountService" class="com.liuyanzhao.spring.demo1.AccountService">
  30.         <property name="accountDao" ref="accountDao"></property>
  31.     </bean>
  32.     <bean id="accountDao" class="com.liuyanzhao.spring.demo1.AccountDao">
  33.         <property name="jdbcTemplate" ref="jdbcTemplate"></property>
  34.     </bean>
  35.     <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
  36.         <property name="dataSource" ref="dataSource"></property>
  37.     </bean>
  38.     <!--第一步、配置事務管理器-->
  39.     <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  40.         <!--注入DataSource-->
  41.         <property name="dataSource" ref="dataSource"></property>
  42.     </bean>
  43.     <!--第二步、配置事務增強-->
  44.     <tx:advice id="txadvice" transaction-manager="transactionManager">
  45.         <!--做事務操作-->
  46.         <tx:attributes>
  47.             <!--設定事務操作的方法匹配規則-->
  48.             <tx:method name="account*" propagation="REQUIRED" />
  49.         </tx:attributes>
  50.     </tx:advice>
  51.     <!--第三步、配置切面-->
  52.     <aop:config>
  53.         <!--切入點-->
  54.         <aop:pointcut id="pointcut1" expression="execution(* com.liuyanzhao.spring.demo1.AccountService.*(..))"/>
  55.         <!--切面-->
  56.         <aop:advisor advice-ref="txadvice" pointcut-ref="pointcut1"/>
  57.     </aop:config>
  58. </beans>
  • ServiceTest.java  測試類
  1. package com.liuyanzhao.spring.demo1;
  2. import org.junit.Test;
  3. import org.springframework.context.ApplicationContext;
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;
  5. /**
  6.  * Created by 言曌 on 2017/8/8.
  7.  */
  8. public class ServiceTest {
  9.     @Test
  10.     public void test() {
  11.         ApplicationContext context =
  12.             new ClassPathXmlApplicationContext("applicationContext.xml");
  13.         AccountService accountService = (AccountService) context.getBean("accountService");
  14.         //Jerry 給 Tom 轉賬 300
  15.         accountService.accountMoney("Jerry","Tom",300);
  16.     }
  17. }

宣告式事務管理(註解)

1、註解的形式更簡單

第一步 配置事務管理器


第二步 配置事務註解


第三步 在要使用事務的方法所在類上面添加註解


以上三步 替代 xml方式 的三步,相對更簡單。

2、完整程式碼如下

  • AccountDao.java

同上

  • ServiceTest.java

同上

  • AccountService.java
  1. package com.liuyanzhao.spring.demo1;
  2. import org.springframework.transaction.annotation.Transactional;
  3. /**
  4.  * Created by 言曌 on 2017/8/8.
  5.  */
  6. @Transactional
  7. public class AccountService {
  8.     //注入ordersDao物件
  9.     private AccountDao accountDao;
  10.     public void setAccountDao(AccountDao accountDao) {
  11.         this.accountDao = accountDao;
  12.     }
  13.     /**
  14.      * @param Transfer_person   轉賬人
  15.      * @param account_holder    收賬人
  16.      * @param money             交易金額
  17.      */
  18.     public void accountMoney(String Transfer_person,String account_holder,double money) {
  19.         //轉賬
  20.         accountDao.outMoney(Transfer_person,money);
  21.         /**
  22.          * 假如,轉賬過程中,出現異常
  23.          * 如果我們不配置事務管理,會出現 轉賬成功,收賬失敗
  24.          * 如果我們配置了事務管理,兩者必然是同時成功,同時失敗
  25.          */
  26.         //int i = 10/0;
  27.         //收賬
  28.         accountDao.inMoney(account_holder,money);
  29.     }
  30. }
  • applicationContext.xml
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.        xmlns:context="http://www.springframework.org/schema/context"
  5.        xmlns:aop="http://www.springframework.org/schema/aop"
  6.        xmlns:tx="http://www.springframework.org/schema/tx"
  7.        xsi:schemaLocation="http://www.springframework.org/schema/beans
  8.     http://www.springframework.org/schema/beans/spring-beans.xsd
  9.     http://www.springframework.org/schema/context
  10.     http://www.springframework.org/schema/context/spring-context.xsd
  11.     http://www.springframework.org/schema/aop
  12.     http://www.springframework.org/schema/aop/spring-aop.xsd
  13.     http://www.springframework.org/schema/tx
  14.     http://www.springframework.org/schema/tx/spring-tx.xsd">
  15.     <context:component-scan base-package="com.liuyanzhao.spring.demo1"/>
  16.     <!-- 引入外部屬性檔案 -->
  17.     <context:property-placeholder location="classpath:jdbc.properties"/>
  18.     <!-- 配置C3P0連線池 -->
  19.     <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
  20.         <property name="driverClass" value="${jdbc.driverClass}"/>
  21.         <property name="jdbcUrl" value="${jdbc.url}"/>
  22.         <property name="user" value="${jdbc.username}"/>
  23.         <property name="password" value=""/>
  24.     </bean>
  25.     <!--
  26.         id值可以隨便寫,與ref對應;
  27.         name值 是 類中的要注入的屬性
  28.     -->
  29.     <bean id="accountService" class="com.liuyanzhao.spring.demo1.AccountService">
  30.         <property name="accountDao" ref="accountDao"></property>
  31.     </bean>
  32.     <bean id="accountDao" class="com.liuyanzhao.spring.demo1.AccountDao">
  33.         <property name="jdbcTemplate" ref="jdbcTemplate"></property>
  34.     </bean>
  35.     <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
  36.         <property name="dataSource" ref="dataSource"></property>
  37.     </bean>
  38.     <!--第一步 配置事務管理器-->
  39.     <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  40.         <property name="dataSource" ref="dataSource"></property>
  41.     </bean>
  42.     <!--第二步 開啟事務註解-->
  43.     <tx:annotation-driven transaction-manager="transactionManager"/>
  44. </beans>

參考:傳智播客視訊

相關推薦

Spring事務管理轉賬例子

搭建轉賬環境 1、建立資料庫,新增資料 2、 建立service和dao類,完成注入關係 (1)service層又叫業務邏輯層 (2)dao層,單純對資料庫操作層,在dao層不新增業務 (3)需求:Jerry 轉賬 300 給 Tom - Jerry 少 300 -

Spring_事務管理轉賬案例

實現一個轉賬的業務: OrderDao.java: package h.l.tx; import org.springframework.jdbc.core.JdbcTemplate; public class OrderDao { private JdbcTemplate jdbc

spring事務管理 隔離級別、傳播行為

1.事務的定義 事務是指多個操作單元組成的合集,多個單元操作是整體不可分割的,要麼都操作不成功,要麼都成功。其必須遵循四個原則(ACID)。 原子性(Atomicity):即事務是不可分割的最小工作單元,事務內的操作要麼全做,要麼全不做; 一致性(Consistency

spring事務管理暫定

spring事務管理 事務有四大特性(ACID) 1.原子性(Atomicity)事務是一個原子操作,由一系列動作組成。事務的原子性確保動作要麼全部完成,要麼完全不起作用。 2.一致性(Consistency)事務在完成時,必須是所有的資料都保持一致狀態。 3.隔離性(Isolat

Spring事務管理宣告式

一、XML方式的宣告式事務管理 1.配置事務管理器 <beans> <!-- 引入屬性檔案--> <context:property-placeholder location="classpath:jdbc.properties"/> <!

Spring事務管理什麼是事務

我們在實際業務場景中,經常會遇到資料頻繁修改讀取的問題。在同一時刻,不同的業務邏輯對同一個表資料進行修改,這種衝突很可能造成資料不可挽回的錯亂,所以我們需要用事務來對資料進行管理。 1

Spring事務管理詳解+例項

寫這篇部落格之前我首先讀了《Spring in action》,之後在網上看了一些關於Spring事務管理的文章,感覺都沒有講全,這裡就將書上的和網上關於事務的知識總結一下,參考的文章如下: 1 初步理解 理解事務之前,先講一個你日常生活中最常乾的事:取錢

MyBatis5:MyBatis 整合 Spring 事務管理

單獨使用MyBatis對事務進行管理 前面MyBatis的文章有寫過相關內容,這裡繼續寫一個最簡單的Demo,算是複習一下之前MyBatis的內容吧,先是建表,建立一個簡單的Student表: create table student (     stude

Spring學習心得24-- Spring事務管理詳解+例項

Spring事務機制詳解 http://www.mamicode.com/info-detail-1248286.html Spring事務配置的五種方式 Spring中的事務管理例項詳解 1 初步理解 理解事務之前,先講一個你日常生活中最常乾的事:取錢。 比如你去A

Spring事務管理詳解+例項

標籤: Spring事務管理,參考的文章如下: Spring事務機制詳解 Spring事務配置的五種方式 Spring中的事務管理例項詳解 1 初步理解 理解事務之前,先講一個你日常生活中最常乾的事:取錢。 比如你去ATM機取1000塊錢,大體有

Spring 事務處理應用篇

spring 系列產品是一個偉大的框架,其中的spring framework 專案作為一個依賴注入的框架,可以說是一個集大成者的角色。系統處理業務的時候,我們都會新增事務,其中事務主要是保證我們業務操作的原子性。 本文會就spring 的本地事務處理

8.Spring整合Hibernate_2_聲明式的事務管理Annotation的方式

之一 為什麽 runtime span nal not 方法 int action 聲明式的事務管理(AOP的主要用途之一) (Annotation的方式)   1.加入annotation.xsd   2.加入txManager bean   3.<tx:annot

spring事務管理幾種方式

pac jpg gets point aos load man classpath XML 轉自:http://blog.csdn.net/jeamking/article/details/43982435 前段時間對Spring的事務配置做了比較深入的研究,在此之間對

Spring 聲明式事務管理11

fault cep 維護 eat ati 信息 圖書管理 rem tro 案例分析   本案例是圖書管理系統精簡部分,在數據庫中有3張表。分別保存圖書庫存、圖書信息和用戶信息。下面是建表SQL語句 1 DROP TABLE IF EXISTS store; 2 DR

Spring.NET教程十六事務管理(應用篇)

目前有很多種資料訪問技術。在.net FCL中,有三類API可以執行事務管理,分別是ADO.NET、企業服務和System.Transactions。其它的資料訪問技術,如物件關係對映(object relational mappers)和結果集對映(result-set mapping)等等的應用也很廣泛,

Spring事務管理機制入門

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

spring事務管理原始碼分析配置和事務增強代理的生成流程

在本篇文章中,將會介紹如何在spring中進行事務管理,之後對其內部原理進行分析。主要涉及 @EnableTransactionManagement註解為我們做了什麼? 為什麼標註了@Transactional註解的方法就可以具有事務的特性,保持了資料的ACID特性?spring到底是如何具有這樣

Spring3Spring事務管理

Spring AOP Spring JDBC Spring 使用 AOP對事務進行實現 Spring 宣告式事務實現: XML方式 XML檔案中配置資料庫連線池、事務管理器、事務增強、aop:事務管理器中 ref引用 dataSource資料來源;事務增強中 tran

Spring持久化支援-Spring事務管理

事務管理的目的是保證資料操作的事務性(原子性、一致性、隔離性、永續性ACID),脫離了事務性,DAO照樣可以順利地進行資料操作。 事務是一系列的動作, 它們被當做一個單獨的工作單元. 這些動作要麼全部完成, 要麼全部不起作用   Spring事務管理是Spring A