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
- package com.liuyanzhao.spring.demo1;
- import org.springframework.jdbc.core.JdbcTemplate;
- /**
- * Created by 言曌 on 2017/8/8.
- */
- public class AccountDao {
- //注入JdbcTemplate物件
- private JdbcTemplate jdbcTemplate;
- public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
- this
- }
- /**
- * @param name 轉賬人
- * @param money 轉賬金額
- */
- public void outMoney(String name,double money) {
- String sql = "update account set money = money - ? where name = ?";
- jdbcTemplate.update(sql,money,name);
- }
- /**
- * @param name 收賬人
- * @param money 收賬金額
- */
- public void inMoney(String name,double money) {
- String sql = "update account set money = money + ? where name = ?";
- jdbcTemplate.update(sql,money,name);
- }
- }
- AccountService.java
- package com.liuyanzhao.spring.demo1;
- /**
- * Created by 言曌 on 2017/8/8.
- */
- public class AccountService {
- //注入ordersDao物件
- private AccountDao accountDao;
- public void setAccountDao(AccountDao accountDao) {
- this.accountDao = accountDao;
- }
- /**
- * @param Transfer_person 轉賬人
- * @param account_holder 收賬人
- * @param money 交易金額
- */
- public void accountMoney(String Transfer_person,String account_holder,double money) {
- //轉賬
- accountDao.outMoney(Transfer_person,money);
- /**
- * 假如,轉賬過程中,出現異常
- * 如果我們不配置事務管理,會出現 轉賬成功,收賬失敗
- * 如果我們配置了事務管理,兩者必然是同時成功,同時失敗
- */
- //int i = 10/0;
- //收賬
- accountDao.inMoney(account_holder,money);
- }
- }
- applicationContext.xml 配置檔案
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:context="http://www.springframework.org/schema/context"
- xmlns:aop="http://www.springframework.org/schema/aop"
- xmlns:tx="http://www.springframework.org/schema/tx"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context.xsd
- http://www.springframework.org/schema/aop
- http://www.springframework.org/schema/aop/spring-aop.xsd
- http://www.springframework.org/schema/tx
- http://www.springframework.org/schema/tx/spring-tx.xsd">
- <context:component-scan base-package="com.liuyanzhao.spring.demo1"/>
- <!-- 引入外部屬性檔案 -->
- <context:property-placeholder location="classpath:jdbc.properties"/>
- <!-- 配置C3P0連線池 -->
- <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
- <property name="driverClass" value="${jdbc.driverClass}"/>
- <property name="jdbcUrl" value="${jdbc.url}"/>
- <property name="user" value="${jdbc.username}"/>
- <property name="password" value=""/>
- </bean>
- <!--
- id值可以隨便寫,與ref對應;
- name值 是 類中的要注入的屬性
- -->
- <bean id="accountService" class="com.liuyanzhao.spring.demo1.AccountService">
- <property name="accountDao" ref="accountDao"></property>
- </bean>
- <bean id="accountDao" class="com.liuyanzhao.spring.demo1.AccountDao">
- <property name="jdbcTemplate" ref="jdbcTemplate"></property>
- </bean>
- <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
- <property name="dataSource" ref="dataSource"></property>
- </bean>
- <!--第一步、配置事務管理器-->
- <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
- <!--注入DataSource-->
- <property name="dataSource" ref="dataSource"></property>
- </bean>
- <!--第二步、配置事務增強-->
- <tx:advice id="txadvice" transaction-manager="transactionManager">
- <!--做事務操作-->
- <tx:attributes>
- <!--設定事務操作的方法匹配規則-->
- <tx:method name="account*" propagation="REQUIRED" />
- </tx:attributes>
- </tx:advice>
- <!--第三步、配置切面-->
- <aop:config>
- <!--切入點-->
- <aop:pointcut id="pointcut1" expression="execution(* com.liuyanzhao.spring.demo1.AccountService.*(..))"/>
- <!--切面-->
- <aop:advisor advice-ref="txadvice" pointcut-ref="pointcut1"/>
- </aop:config>
- </beans>
- ServiceTest.java 測試類
- package com.liuyanzhao.spring.demo1;
- import org.junit.Test;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- /**
- * Created by 言曌 on 2017/8/8.
- */
- public class ServiceTest {
- @Test
- public void test() {
- ApplicationContext context =
- new ClassPathXmlApplicationContext("applicationContext.xml");
- AccountService accountService = (AccountService) context.getBean("accountService");
- //Jerry 給 Tom 轉賬 300
- accountService.accountMoney("Jerry","Tom",300);
- }
- }
宣告式事務管理(註解)
1、註解的形式更簡單
第一步 配置事務管理器
第二步 配置事務註解
第三步 在要使用事務的方法所在類上面添加註解
以上三步 替代 xml方式 的三步,相對更簡單。
2、完整程式碼如下
- AccountDao.java
同上
- ServiceTest.java
同上
- AccountService.java
- package com.liuyanzhao.spring.demo1;
- import org.springframework.transaction.annotation.Transactional;
- /**
- * Created by 言曌 on 2017/8/8.
- */
- @Transactional
- public class AccountService {
- //注入ordersDao物件
- private AccountDao accountDao;
- public void setAccountDao(AccountDao accountDao) {
- this.accountDao = accountDao;
- }
- /**
- * @param Transfer_person 轉賬人
- * @param account_holder 收賬人
- * @param money 交易金額
- */
- public void accountMoney(String Transfer_person,String account_holder,double money) {
- //轉賬
- accountDao.outMoney(Transfer_person,money);
- /**
- * 假如,轉賬過程中,出現異常
- * 如果我們不配置事務管理,會出現 轉賬成功,收賬失敗
- * 如果我們配置了事務管理,兩者必然是同時成功,同時失敗
- */
- //int i = 10/0;
- //收賬
- accountDao.inMoney(account_holder,money);
- }
- }
- applicationContext.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:context="http://www.springframework.org/schema/context"
- xmlns:aop="http://www.springframework.org/schema/aop"
- xmlns:tx="http://www.springframework.org/schema/tx"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context.xsd
- http://www.springframework.org/schema/aop
- http://www.springframework.org/schema/aop/spring-aop.xsd
- http://www.springframework.org/schema/tx
- http://www.springframework.org/schema/tx/spring-tx.xsd">
- <context:component-scan base-package="com.liuyanzhao.spring.demo1"/>
- <!-- 引入外部屬性檔案 -->
- <context:property-placeholder location="classpath:jdbc.properties"/>
- <!-- 配置C3P0連線池 -->
- <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
- <property name="driverClass" value="${jdbc.driverClass}"/>
- <property name="jdbcUrl" value="${jdbc.url}"/>
- <property name="user" value="${jdbc.username}"/>
- <property name="password" value=""/>
- </bean>
- <!--
- id值可以隨便寫,與ref對應;
- name值 是 類中的要注入的屬性
- -->
- <bean id="accountService" class="com.liuyanzhao.spring.demo1.AccountService">
- <property name="accountDao" ref="accountDao"></property>
- </bean>
- <bean id="accountDao" class="com.liuyanzhao.spring.demo1.AccountDao">
- <property name="jdbcTemplate" ref="jdbcTemplate"></property>
- </bean>
- <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
- <property name="dataSource" ref="dataSource"></property>
- </bean>
- <!--第一步 配置事務管理器-->
- <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
- <property name="dataSource" ref="dataSource"></property>
- </bean>
- <!--第二步 開啟事務註解-->
- <tx:annotation-driven transaction-manager="transactionManager"/>
- </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 初步理解 理解事務之前,先講一個你日常生活中最常乾的事:取錢
MyBatis(5):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到底是如何具有這樣
Spring(3)之 Spring事務管理
Spring AOP Spring JDBC Spring 使用 AOP對事務進行實現 Spring 宣告式事務實現: XML方式 XML檔案中配置資料庫連線池、事務管理器、事務增強、aop:事務管理器中 ref引用 dataSource資料來源;事務增強中 tran
Spring持久化支援(一)-Spring事務管理
事務管理的目的是保證資料操作的事務性(原子性、一致性、隔離性、永續性ACID),脫離了事務性,DAO照樣可以順利地進行資料操作。 事務是一系列的動作, 它們被當做一個單獨的工作單元. 這些動作要麼全部完成, 要麼全部不起作用 Spring事務管理是Spring A