事务:保证数据的运行不会说A给B钱,A钱给了B却没收到。

实现事务的三种方式(重要代码):

1.aspectJ AOP实现事务:

<bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dateSource"></property>
</bean>
<tx:advice id="stockAdvice" transaction-manager="dataSourceTransactionManager">
<tx:attributes>
<tx:method name="by*" isolation="DEFAULT" propagation="REQUIRED" rollback-for="MyExepction"/>
<tx:method name="select*" isolation="DEFAULT" propagation="REQUIRED" read-only="true"></tx:method>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="exAdvice" expression="execution(* *..service.*.*(..))"></aop:pointcut>
<aop:advisor advice-ref="stockAdvice" pointcut-ref="exAdvice"></aop:advisor>
</aop:config>

2.事务代理工厂Bean实现事务:

<bean id="tproxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager" ref="dataSourceTransactionManager"></property>&lt;!&ndash;写的是事务&ndash;&gt;
<property name="target" ref="byStockService"></property>&lt;!&ndash;要进行事务的类&ndash;&gt;
<property name="transactionAttributes">
<props>&lt;!&ndash;key写的是service层要增强的方法&ndash;&gt;
&lt;!&ndash; 事务的隔离级别,后面逗号后面是异常类,用于回滚数据&ndash;&gt;
<prop key="ByStock">ISOLATION_DEFAULT,PROPAGATION_REQUIRED,-MyExepction</prop>
</props>
</property>
</bean>

3.注解方式实现事务:

<tx:annotation-driven transaction-manager="dataSourceTransactionManager"/>
在需要进行事务的方法上增加一个注解“@Transactional(rollbackFor = MyExepction.class )”

做一个买股票的小例子来看一下事务:

1.使用事务工厂Bean:

xml:

这个异常刚好卡在支付金额,和股票增加直接,

 RuntimeException是运行时异常
Exception是检查异常
两者的区别:
运行时异常是默认回滚,
检查异常是默认提交的。

数据表:

结果异常出现后,数据进行了回滚,A表中并没有少余额,B表中也没有多股票。

基本的架构:

  dao:

IStockDao:
package cn.Spring.Day20xy.dao;

public interface IStockDao {
public int updateStock(int sid,int soucnt,boolean isbuay)throws Exception;
}
IAccountDao:
package cn.Spring.Day20xy.dao;

public interface IAccountDao {
public int updateAccount(int aid,Double amoeny,boolean isbay) throws Exception;
}
StockDaoImpl:
package cn.Spring.Day20xy.dao;

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

public class StockDaoImpl extends JdbcDaoSupport implements IStockDao {

    @Override
public int updateStock(int sid, int soucnt, boolean isbuay) throws Exception {
String sql="";
if (isbuay){
sql="update stock set scount=scount+? where sid=?";
}else {
sql="update stock set scount=scount-? where sid=?";
}
return this.getJdbcTemplate().update(sql,soucnt,sid);
}
}
AccountDaoImpl:
package cn.Spring.Day20xy.dao;

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

public class AccountDaoImpl extends JdbcDaoSupport implements IAccountDao{
@Override
public int updateAccount(int aid,Double amoeny,boolean isbay) throws Exception {
String sql="";
if (isbay){
sql="update account set abalance=abalance-? where aid=?";
}else {
sql="update account set abalance=abalance+? where aid=?";
}
return this.getJdbcTemplate().update(sql,amoeny,aid);
}
}

  entity:

Account:
package cn.Spring.Day20xy.entity;

public class Account {
private Integer aid;
private String aname;
private double abalance; 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 double getAbalance() {
return abalance;
} public void setAbalance(double abalance) {
this.abalance = abalance;
}
}

  

Stock:
package cn.Spring.Day20xy.entity;

public class Stock {
//股票代号
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;
}
}
MyExepction:
package cn.Spring.Day20xy.entity;

public class MyExepction extends RuntimeException {
public MyExepction() {
} public MyExepction(String message) {
super(message);
} }

  service:

IByStockService :

package cn.Spring.Day20xy.service;

public interface IByStockService {
public int ByStock(int aid,double moeny,int sid ,int count)throws Exception;
}
ByStockServiceImpl:
package cn.Spring.Day20xy.service;

import cn.Spring.Day20xy.dao.IAccountDao;
import cn.Spring.Day20xy.dao.IStockDao;
import cn.Spring.Day20xy.entity.MyExepction;
import org.springframework.transaction.annotation.Transactional; public class ByStockServiceImpl implements IByStockService{
//植入Dao
private IAccountDao accountDao;
private IStockDao stockDao; @Override
@Transactional(rollbackFor = MyExepction.class )
public int ByStock(int aid,double moeny,int sid ,int count) throws Exception {
boolean isbay=true;
int i = accountDao.updateAccount(aid, moeny, isbay);
if (1==1) {
throw new MyExepction("出异常了");
}
int i1 = stockDao.updateStock(sid, count, isbay);
return i+i1;
} public IAccountDao getAccountDao() {
return accountDao;
} public void setAccountDao(IAccountDao accountDao) {
this.accountDao = accountDao;
} public IStockDao getStockDao() {
return stockDao;
} public void setStockDao(IStockDao stockDao) {
this.stockDao = stockDao;
}
}

  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: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/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">
<!--1.配置数据源-->
<bean id="dateSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql:///newss2230"></property>
<property name="username" value="root"></property>
<property name="password" value="123"></property>
</bean>
<context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>
<!--2.JDBCTampLate-->
<bean id="jdbcTempLate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dateSource"></property>
</bean>
<!--3.Dao-->
<bean id="accountDao" class="cn.Spring.Day20xy.dao.AccountDaoImpl">
<property name="jdbcTemplate" ref="jdbcTempLate"></property>
</bean>
<!--3.Dao-->
<bean id="stockDao" class="cn.Spring.Day20xy.dao.StockDaoImpl">
<property name="jdbcTemplate" ref="jdbcTempLate"></property>
</bean>
<!--4.Service-->
<bean id="byStockService" class="cn.Spring.Day20xy.service.ByStockServiceImpl">
<property name="accountDao" ref="accountDao"></property>
<property name="stockDao" ref="stockDao"></property> <!--事务-->
</bean>
<bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dateSource"></property>
</bean> <!--事务注解驱动-->
<tx:annotation-driven transaction-manager="dataSourceTransactionManager"/>
<!--事务代理工厂bean-->
<!--<bean id="tproxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager" ref="dataSourceTransactionManager"></property>
<property name="target" ref="byStockService"></property>
<property name="transactionAttributes">
<props>&lt;!&ndash;key写的是service层的方法&ndash;&gt;
<prop key="ByStock">ISOLATION_DEFAULT,PROPAGATION_REQUIRED,-MyExepction</prop>
</props>
</property>
</bean>-->
</beans>

Spring 实现事务的三种方式的更多相关文章

  1. spring生成EntityManagerFactory的三种方式

    spring生成EntityManagerFactory的三种方式 1.LocalEntityManagerFactoryBean只是简单环境中使用.它使用JPA PersistenceProvide ...

  2. Spring 使用AspectJ的三种方式

    Spring 使用AspectJ 的三种方式 一,使用JavaConfig 二,使用注解隐式配置 三,使用XML 配置 背景知识: 注意 使用AspectJ 的 时候 要导入相应的Jar 包 嗯 昨天 ...

  3. spring创建bean的三种方式

    spring创建bean的三种方式: 1通过构造方法创建bean(最常用) 1.1 spring默认会通过无参构造方法来创建bean,如果xml文件是这样配置,则实体类中必须要有无参构造方法,无参构造 ...

  4. Spring静态注入的三种方式

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/chen1403876161/article/details/53644024Spring静态注入的三 ...

  5. Spring 循环依赖的三种方式(三级缓存解决Set循环依赖问题)

    本篇文章解决以下问题: [1] . Spring循环依赖指的是什么? [2] . Spring能解决哪种情况的循环依赖?不能解决哪种情况? [3] . Spring能解决的循环依赖原理(三级缓存) 一 ...

  6. SSH深度历险记(八) 剖析SSH核心原则+Spring依赖注入的三种方式

           于java发育.一类程序猿必须依靠类的其他方法,它是通常new依赖类的方法,然后调用类的实例,这样的发展问题new良好的班统一管理的例子.spring提出了依赖注入的思想,即依赖类不由程 ...

  7. SSH深度历险(八) 剖析SSH核心原理+Spring依赖注入的三种方式

           在java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依 ...

  8. Spring配置dataSource的三种方式 数据库连接池

    1.使用org.springframework.jdbc.dataSource.DriverManagerDataSource 说明:DriverManagerDataSource建立连接是只要有连接 ...

  9. spring mvc handler的三种方式

    springmvc.xml 三种方式不能针对一个controller同时使用 <?xml version="1.0" encoding="UTF-8"?& ...

随机推荐

  1. linux ssh反向代理

    参考:https://segmentfault.com/a/1190000002718360 内外运行:sshpass -p 123456 ssh -fNR 5000:localhost:22 ser ...

  2. 软工作业1—java实现wc.exe

    github项目地址 https://github.com/liyizhu/wc.exe WC 项目要求 基本功能列表: wc.exe -c file.c     //返回文件 file.c 的字符数 ...

  3. linux学习第十六天 (Linux就该这么学)

    今生讲了邮件的产生和解决和实际问题,把前两天的和这节邮箱系统统一布置,又统一复习和学习了一下,

  4. mysql读写分离——中间件ProxySQL的简介与配置

    mysql实现读写分离的方式 mysql 实现读写分离的方式有以下几种: 程序修改mysql操作,直接和数据库通信,简单快捷的读写分离和随机的方式实现的负载均衡,权限独立分配,需要开发人员协助. am ...

  5. C# BitArray 二进制处理

    int k = 6; byte[] bytearr = BitConverter.GetBytes(k); BitArray myBA = new BitArray(bytearr); for (in ...

  6. RNQOJ PID28 / [Stupid]愚蠢的宠物

    勉勉强强够着点并查集的边,题目吧他分类到并查集也无可厚非,这里与常规的并查集的区别在于要做一个mark数组进行一下标记,展开来说就是对于要查询的A,B,先对A进行处理,把A所有的前驱也就是双亲节点进行 ...

  7. Windows 10 专业版 长期服务版 激活

    这个用小白系统之后一段时间显示要求激活,或者更改产品秘钥.网上找了许多秘钥也是没啥用,又不想用激活工具的话,可以试试用win+R 输入cmd : 依次输入:slmgr /skms kms.digibo ...

  8. hive插入数据-单条

    写入数据到hive的hdfs文件中即可,hive创建表的时候用小写做表名,不然查不到 相关操作如下: 查看目录与表 hive> dfs -ls /user/hive/warehouse/ 准备h ...

  9. 别人的Linux私房菜(18)认识系统服务(daemon)

    完成服务service的程序称为daemon.完成计划性的服务程序如crond是一个daemon. 早期的System V的init管理daemon操作中,系统内核首先调用init,然后init运行系 ...

  10. WebAPI之DOM和BOM

    API是什么? Application Programming Interface:应用程序编程接口,是一些预先定义的函数,通俗的理解就是一些方法. WebAPI是什么? 浏览器提供的一套操作浏览器功 ...