SSM-Spring-21:Spring中事物的使用案例
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------
股票买卖案例(我会用三种开启事物的方法 代理工厂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中事物的使用案例的更多相关文章
- mysql数据库隔离级别及其原理、Spring的7种事物传播行为
一.事务的基本要素(ACID) 1.原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节.事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有 ...
- SSM(spring mvc+spring+mybatis)学习路径——2-1、spring MVC入门
目录 2-1 Spring MVC起步 一.回顾Servlet 二.SpringMVC简介 三.搭建SpringMVC第一个案例 四.简单流程及配置 五.使用注解开发Controller 六.参数绑定 ...
- [原创]java WEB学习笔记109:Spring学习---spring中事物管理
博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好 ...
- SSM(spring mvc+spring+mybatis)学习路径——2-2、spring MVC拦截器
目录 2-2 Spring MVC拦截器 第一章 概述 第二章 Spring mvc拦截器的实现 2-1 拦截器的工作原理 2-2 拦截器的实现 2-3 拦截器的方法介绍 2-4 多个拦截器应用 2- ...
- 浅谈IDEA集成SSM框架(SpringMVC+Spring+MyBatis)
前言 学习完MyBatis,Spring,SpringMVC之后,我们需要做的就是将这三者联系起来,Spring实现业务对象管理,Spring MVC负责请求的转发和视图管理, MyBatis作为数据 ...
- 一步步教你整合SSM框架(Spring MVC+Spring+MyBatis)详细教程重要
前言 SSM(Spring+SpringMVC+Mybatis)是目前较为主流的企业级架构方案,不知道大家有没有留意,在我们看招聘信息的时候,经常会看到这一点,需要具备SSH框架的技能:而且在大部分教 ...
- ssm(spring,spring mvc,mybatis)框架
ssm框架各个技术的职责 spring :spring是一个IOC DI AOP的 容器类框架 spring mvc:spring mvc 是一个mvc框架 mybatis:是一个orm的持久层框架 ...
- 使用Eclipse搭建SSM框架(Spring + Spring MVC + Mybatis)
1.创建项目 1)打开Eclipse,点击File --> New --> Other 2)输入maven,找到Maven Project 3)然后一直按Next,直到出现一下界面: 4) ...
- java web后台开发SSM框架(Spring+SpringMVC+MyBaitis)搭建与优化
一.ssm框架搭建 1.1创建项目 新建项目后规划好各层的包. 1.2导入包 搭建SSM框架所需包百度云链接:http://pan.baidu.com/s/1cvKjL0 1.3整合spring与my ...
随机推荐
- PS图层混合算法之四(亮光, 点光, 线性光, 实色混合)
亮光模式: 根据绘图色通过增加或降低"对比度",加深或减淡颜色.如果绘图色比50%的灰亮,图像通过降低对比度被照亮,如果绘图色比50%的灰暗,图像通过增加对比度变暗. 线性光模式: ...
- java 编程性能调优
一.避免在循环条件中使用复杂表达式 在不做编译优化的情况下,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快. 例子: import java.util ...
- Oracle E-Business Suite Release 12.2 Information Center - Manage
Oracle E-Business Suite Maintenance Guide Release 12.2 Part No. E22954-14 PDF: http://docs.oracl ...
- 打印机威胁:嵌入式Web服务有安全问题
现在大多数打印机.扫描仪,以及VoIP系统等设备都会内建嵌入式的Web服务,这主要是为了方便管理.然而不幸的是,这些设备大多会由于设置问题而处在无保护状态下.有些服务甚至可以使用默认的帐号和密码访问, ...
- GCC/gcc/g++/CC/cc区别
平常在Linux上经常会用到gcc或者g++来编译程序,但对这两者的理解也就停留在一个是用来编译C程序,另一个是用来编译C++程序的(请注意:这种说法是有问题的,待会改进). 1. GCC GCC,是 ...
- 【Qt编程】基于Qt的词典开发系列<十一>系统托盘的显示
本文主要讨论Qt中的系统托盘的设置.系统托盘想必大家都不陌生,最常用的就是QQ.系统托盘以简单.小巧的形式能让人们较快的打开软件.废话不多说,下面开始具体介绍. 首先,新建一个Qt Gui项目,类型选 ...
- Linux - 停机常用的anacron
什么是 anacron anacron 并不是用来取代 crontab 的,anacron 存在的目的就在於我们上头提到的,在处理非 24 小时一直启动的 Linux 系统的 crontab 的运行! ...
- Apriori和FPTree
Apriori算法和FPTree算法都是数据挖掘中的关联规则挖掘算法,处理的都是最简单的单层单维布尔关联规则. Apriori算法 Apriori算法是一种最有影响的挖掘布尔关联规则频繁项集的算法.是 ...
- 白瑜庆:知乎基于Kubernetes的kafka平台的设计和实现
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文首发在云+社区,未经许可,不得转载. 自我介绍 我是知乎的技术中台工程师,现在是负责知乎的存储相关组件.我的分享主要基于三个,一个是简单 ...
- objc/runtime.h 查看私有api
objc/runtime.h 相关 Objecitve-C的重要特性是Runtime(运行时),在Interacting with the Runtime(交互运行)中,运行时函数部分,苹果给出了/u ...