------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------

股票买卖案例(我会用三种开启事物的方法 代理工厂bean版的,注解版的,aspectj xml版的)

  简单的介绍一下这个小例子,就是俩个表,一个就是你的账户表,一张就是你的股票的表

  一切从简,写的简单一点(你可以看成有很多不严谨的地方,只是一个Spring中的事务的简单使用,仅供理解事务,不用想太多)

  之前的那些jar包就不说了,从案例开始

01.数据库准备:

  01.1账户表Account

    

  01.2股票表Stock

    

02.IDEA中分层开发:

  02.1实体类(前面俩个实体类可以说在这个例子里没有用到,但是这是一种习惯)

    StockInfo表

package cn.dawn.day22tx.entity;

/**
* Created by Dawn on 2018/3/15.
*/
public class StockInfo {
private Integer sid;
private String sname;
private Integer scount; public Integer getSid() {
return sid;
} public void setSid(Integer sid) {
this.sid = sid;
} public String getSname() {
return sname;
} public void setSname(String sname) {
this.sname = sname;
} public Integer getScount() {
return scount;
} public void setScount(Integer scount) {
this.scount = scount;
}
}

    AccountInfo表

package cn.dawn.day22tx.entity;

/**
* Created by Dawn on 2018/3/15.
*/
public class AccountInfo {
private Integer aid;
private String aname;
private Integer ablance; public Integer getAid() {
return aid;
} public void setAid(Integer aid) {
this.aid = aid;
} public String getAname() {
return aname;
} public void setAname(String aname) {
this.aname = aname;
} public Integer getAblance() {
return ablance;
} public void setAblance(Integer ablance) {
this.ablance = ablance;
}
}

    StockException类

package cn.dawn.day22tx.entity;

/**
* Created by Dawn on 2018/3/15.
*/
public class StockException extends ClassNotFoundException {
public StockException() {
} public StockException(String s) {
super(s);
}
}

    这个类有点要说的,Spring的事务中执行一半遇到异常怎么操作?默认情况下是运行异常会回滚/受查异常会提交这执行过的代码,所以我做了个受查异常,一会可以测试一下

  02.2dao层,一个对股票表操作,一个对账户表操作

    IStockDAO股票接口

package cn.dawn.day22tx.dao;

/**
* Created by Dawn on 2018/3/15.
*/
public interface IStockDAO {
public boolean updateStock(int sid,int scount,boolean isBuy);
}

    StockDAOImpl股票接口的实现类

package cn.dawn.day22tx.dao;

import org.springframework.jdbc.core.support.JdbcDaoSupport;

/**
* Created by Dawn on 2018/3/15.
*/
public class StockDAOImpl extends JdbcDaoSupport implements IStockDAO {
public boolean updateStock(int sid, int scount, boolean isBuy) {
String sql="";
boolean flag=false;
if (isBuy){
//买股票
sql="update stock set scount=scount+? where sid=?";
}else {
sql="update stock set scount=scount-? where sid=?";
}
int result = this.getJdbcTemplate().update(sql,scount,sid);
if (result>) {
flag = true;
}
return flag;
}
}

    这儿我将isBuy的布尔变量当等于true的时候,进行买股票操作,你的股票表上的股票股数增加

    IAccountDAO账户接口

package cn.dawn.day22tx.dao;

/**
* Created by Dawn on 2018/3/15.
*/
public interface IAccountDAO {
public boolean updateAccount(int aid,int ablance,boolean isBuy);
}

    AccountDAOImpl账户的实现类

package cn.dawn.day22tx.dao;

import org.springframework.jdbc.core.support.JdbcDaoSupport;

/**
* Created by Dawn on 2018/3/15.
*/
public class AccountDAOImpl extends JdbcDaoSupport implements IAccountDAO {
public boolean updateAccount(int aid, int ablance, boolean isBuy) {
String sql="";
boolean flag=false;
if(isBuy){
//买股票
sql="update account set ablance=ablance-? where aid=?";
}else {
sql="update account set ablance=ablance+? where aid=?";
}
int count = this.getJdbcTemplate().update(sql, ablance, aid);
if(count>){
flag=true;
}
return flag;
}
}

  02.3service层

    股票的交易接口IStockPayService

package cn.dawn.day22tx.service;

import cn.dawn.day22tx.entity.StockException;

/**
* Created by Dawn on 2018/3/15.
*/
public interface IStockPayService {
public boolean buyStock(int aid,int ablance,int sid,int scount) throws StockException;
}

    股票交易的实现类StockPayServiceImpl

package cn.dawn.day22tx.service;

import cn.dawn.day22tx.dao.IAccountDAO;
import cn.dawn.day22tx.dao.IStockDAO;
import cn.dawn.day22tx.entity.StockException;
import org.springframework.transaction.annotation.Transactional; /**
* Created by Dawn on 2018/3/15.
*/
public class StockPayServiceImpl implements IStockPayService {
IStockDAO iStockDAO;
IAccountDAO iAccountDAO;
//@Transactional(rollbackFor = StockException.class)
public boolean buyStock(int aid, int ablance, int sid, int scount) throws StockException {
boolean isBuy=true;
boolean sflag = iStockDAO.updateStock(sid, scount, isBuy); if(true){
throw new StockException("网络被挂掉异常");
} boolean aflag = iAccountDAO.updateAccount(aid, ablance, isBuy); if(sflag&&aflag)
return true;
else
return false;
} public IStockDAO getiStockDAO() {
return iStockDAO;
} public void setiStockDAO(IStockDAO iStockDAO) {
this.iStockDAO = iStockDAO;
} public IAccountDAO getiAccountDAO() {
return iAccountDAO;
} public void setiAccountDAO(IAccountDAO iAccountDAO) {
this.iAccountDAO = iAccountDAO;
}
}

    看到那个方法上面注释掉的那个注解了吗?那是第二种方式要用到,只有在第二种方式注解版的时候才用到,其他俩种方式就注释掉它,免得有干扰,切记,用的时候把注释消掉,不用就注释它

    @Transactional里面我只写了遇到什么异常会回滚,它的传播行为和隔离级别有默认值,我就省略了

03.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:aop="http://www.springframework.org/schema/aop"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
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/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd"> <!--配置jdbc。properties-->
<context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder> <!--阿里的Druid-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${jdbc.driver}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean> <!--dao层-->
<bean id="stockDAO" class="cn.dawn.day22tx.dao.StockDAOImpl">
<property name="dataSource" ref="dataSource"></property>
</bean>
<bean id="accountDAO" class="cn.dawn.day22tx.dao.AccountDAOImpl">
<property name="dataSource" ref="dataSource"></property>
</bean> <!--service-->
<bean id="stockpPayService" class="cn.dawn.day22tx.service.StockPayServiceImpl">
<property name="iAccountDAO" ref="accountDAO"></property>
<property name="iStockDAO" ref="stockDAO"></property>
</bean> <!--事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--第三种方式 aspectj xml版-->
<tx:advice id="txadvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="buyStock" isolation="DEFAULT" propagation="REQUIRED" rollback-for="StockException"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="mypointccut" expression="execution(* *..day22tx.service.*.*(..))"></aop:pointcut>
<aop:advisor advice-ref="txadvice" pointcut-ref="mypointccut"></aop:advisor>
</aop:config> <!--第二种事务开启方式,注解版-->
<!--<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>--> <!--第一种事务开启方式代理工厂-->
<!--<bean id="txService" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager" ref="transactionManager"></property>
<property name="target" ref="stockpPayService"></property>
<property name="transactionAttributes">
<props>
<prop key="buyStock">ISOLATION_DEFAULT,PROPAGATION_REQUIRED,-StockException</prop>
</props>
</property>
</bean>-->
</beans>

  没什么需要说的,这儿像什么命名空间等需要注意一点,其他的就是照猫画虎

  有什么不清楚的评论留言,我会帮忙解决

04.单测方法:

package cn.dawn.day22tx;

import cn.dawn.day22tx.entity.StockException;
import cn.dawn.day22tx.service.IStockPayService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; import java.util.List; /**
* Created by Dawn on 2018/3/3.
*/
public class test20180315 {
@Test
/*aspectj xml方式*/
public void t03() {
ApplicationContext context=new ClassPathXmlApplicationContext("ApplicationContext-day22tx.xml");
IStockPayService service = (IStockPayService) context.getBean("stockpPayService");
boolean flag = false;
try {
flag = service.buyStock(, , , );
} catch (StockException e) {
e.printStackTrace();
}
if(flag){
System.out.println("购买成功");
} } @Test
/*注解方式*/
public void t02() {
ApplicationContext context=new ClassPathXmlApplicationContext("ApplicationContext-day22tx.xml");
IStockPayService service = (IStockPayService) context.getBean("stockpPayService");
boolean flag = false;
try {
flag = service.buyStock(, , , );
} catch (StockException e) {
e.printStackTrace();
}
if(flag){
System.out.println("购买成功");
} } @Test
/*代理工厂bean的方式*/
public void t01() {
ApplicationContext context=new ClassPathXmlApplicationContext("ApplicationContext-day22tx.xml");
IStockPayService service = (IStockPayService) context.getBean("txService");
boolean flag = false;
try {
flag = service.buyStock(, , , );
} catch (StockException e) {
e.printStackTrace();
}
if(flag){
System.out.println("购买成功");
} }
}

  简述一下运行结果,单测成功,中途会打印异常信息,由于开启了事务,同生共死,俩张表在数据库都没有改变值,事务的出口被回滚了

SSM-Spring-21:Spring中事物的使用案例的更多相关文章

  1. mysql数据库隔离级别及其原理、Spring的7种事物传播行为

    一.事务的基本要素(ACID) 1.原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节.事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有 ...

  2. SSM(spring mvc+spring+mybatis)学习路径——2-1、spring MVC入门

    目录 2-1 Spring MVC起步 一.回顾Servlet 二.SpringMVC简介 三.搭建SpringMVC第一个案例 四.简单流程及配置 五.使用注解开发Controller 六.参数绑定 ...

  3. [原创]java WEB学习笔记109:Spring学习---spring中事物管理

    博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好 ...

  4. SSM(spring mvc+spring+mybatis)学习路径——2-2、spring MVC拦截器

    目录 2-2 Spring MVC拦截器 第一章 概述 第二章 Spring mvc拦截器的实现 2-1 拦截器的工作原理 2-2 拦截器的实现 2-3 拦截器的方法介绍 2-4 多个拦截器应用 2- ...

  5. 浅谈IDEA集成SSM框架(SpringMVC+Spring+MyBatis)

    前言 学习完MyBatis,Spring,SpringMVC之后,我们需要做的就是将这三者联系起来,Spring实现业务对象管理,Spring MVC负责请求的转发和视图管理, MyBatis作为数据 ...

  6. 一步步教你整合SSM框架(Spring MVC+Spring+MyBatis)详细教程重要

    前言 SSM(Spring+SpringMVC+Mybatis)是目前较为主流的企业级架构方案,不知道大家有没有留意,在我们看招聘信息的时候,经常会看到这一点,需要具备SSH框架的技能:而且在大部分教 ...

  7. ssm(spring,spring mvc,mybatis)框架

    ssm框架各个技术的职责 spring :spring是一个IOC DI AOP的 容器类框架 spring mvc:spring mvc 是一个mvc框架 mybatis:是一个orm的持久层框架 ...

  8. 使用Eclipse搭建SSM框架(Spring + Spring MVC + Mybatis)

    1.创建项目 1)打开Eclipse,点击File --> New --> Other 2)输入maven,找到Maven Project 3)然后一直按Next,直到出现一下界面: 4) ...

  9. java web后台开发SSM框架(Spring+SpringMVC+MyBaitis)搭建与优化

    一.ssm框架搭建 1.1创建项目 新建项目后规划好各层的包. 1.2导入包 搭建SSM框架所需包百度云链接:http://pan.baidu.com/s/1cvKjL0 1.3整合spring与my ...

随机推荐

  1. HashMap二三事

    先看看hashmap在整个Collection中的位置 HashMap中存储数据的结构是 /** * The table, resized as necessary. Length MUST Alwa ...

  2. Objective-C的面向对象特性(二)

    在Objective-C语言中, 类别.类扩展(也称为匿名类别)以及协议是Objective-C 语言级别支持的模式,用来实现对类进行功能扩展. 一.类别--用来增加方法到已存在类 声明一个类别的语法 ...

  3. Select、Poll与Epoll比较

    (1)select select最早于1983年出现在4.2BSD中,它通过一个select()系统调用来监视多个文件描述符的数组,当select()返回后,该数组中就绪的文件描述符便会被内核修改标志 ...

  4. ibm云时代的转型

    好几个月了,有两个说法很流行. 第一个说法,是老有人嚷嚷思科快被SDN整趴下了:第二个说法,是老有人嚷嚷IBM在云计算时代完全落后了,要倒下了. 刚开始我还跟有些人辩论: 1.裁员是西方企业常用的战略 ...

  5. break和continue的简单介绍

    1.break break 用于完全结束一个循环,跳出循环体!不管是哪种循环,如果在程序中遇到Break,系统将完全结束该循环,开始执行循环之后的代码: public class TestBreak ...

  6. rails项目如何改变已建立的model结构

    有时候第一次用rails g model或者scaffold建立数据模型的时候难免会出错,比如字段类型错误或者字段名称错误,甚至少添加或多添加了几个字段哦.这种情况下手动去修改数据结构是比较头疼的,官 ...

  7. Eclipse 3.5 以后安装插件很慢的解决办法

    1 .除非你需要,否则不要选择"联接到所有更新站点" 在安装对话框里有一个小复选框,其标示为"在安装过程中联接到所有更新站点从而找到所需的软件."从表面上看,这 ...

  8. 使用SecureCRT的SFTP在WINDOWS与LINUX之间传输文件(转载)

    参考文献: http://ice-k.iteye.com/blog/1068275 http://www.cnblogs.com/chen1987lei/archive/2010/11/26/1888 ...

  9. 双机热备ROSE HA工作原理

    双机热备ROSE HA工作原理 当双机热备软件启动后,ROSE HA首先启动HA Manager管理程序,根据高可靠性系统的配置结构初始化,然后启动必要的服务和代理程序来监控和管理系统服务.HA代理程 ...

  10. SpringMvc+AngularJS通过CORS实现跨域方案

    什么是跨域请求问题? 这个问题的起因在于现代浏览器默认都会基于安全原因而阻止跨域的ajax请求,这是现代浏览器中必备的功能,但是往往给开发带来不便. 但跨域的需求却一直都在,为了跨域,勤劳勇敢的程序猿 ...