Spring 实现事务的三种方式
事务:保证数据的运行不会说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><!–写的是事务–>
<property name="target" ref="byStockService"></property><!–要进行事务的类–>
<property name="transactionAttributes">
<props><!–key写的是service层要增强的方法–>
<!– 事务的隔离级别,后面逗号后面是异常类,用于回滚数据–>
<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><!–key写的是service层的方法–>
<prop key="ByStock">ISOLATION_DEFAULT,PROPAGATION_REQUIRED,-MyExepction</prop>
</props>
</property>
</bean>-->
</beans>
Spring 实现事务的三种方式的更多相关文章
- spring生成EntityManagerFactory的三种方式
spring生成EntityManagerFactory的三种方式 1.LocalEntityManagerFactoryBean只是简单环境中使用.它使用JPA PersistenceProvide ...
- Spring 使用AspectJ的三种方式
Spring 使用AspectJ 的三种方式 一,使用JavaConfig 二,使用注解隐式配置 三,使用XML 配置 背景知识: 注意 使用AspectJ 的 时候 要导入相应的Jar 包 嗯 昨天 ...
- spring创建bean的三种方式
spring创建bean的三种方式: 1通过构造方法创建bean(最常用) 1.1 spring默认会通过无参构造方法来创建bean,如果xml文件是这样配置,则实体类中必须要有无参构造方法,无参构造 ...
- Spring静态注入的三种方式
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/chen1403876161/article/details/53644024Spring静态注入的三 ...
- Spring 循环依赖的三种方式(三级缓存解决Set循环依赖问题)
本篇文章解决以下问题: [1] . Spring循环依赖指的是什么? [2] . Spring能解决哪种情况的循环依赖?不能解决哪种情况? [3] . Spring能解决的循环依赖原理(三级缓存) 一 ...
- SSH深度历险记(八) 剖析SSH核心原则+Spring依赖注入的三种方式
于java发育.一类程序猿必须依靠类的其他方法,它是通常new依赖类的方法,然后调用类的实例,这样的发展问题new良好的班统一管理的例子.spring提出了依赖注入的思想,即依赖类不由程 ...
- SSH深度历险(八) 剖析SSH核心原理+Spring依赖注入的三种方式
在java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依 ...
- Spring配置dataSource的三种方式 数据库连接池
1.使用org.springframework.jdbc.dataSource.DriverManagerDataSource 说明:DriverManagerDataSource建立连接是只要有连接 ...
- spring mvc handler的三种方式
springmvc.xml 三种方式不能针对一个controller同时使用 <?xml version="1.0" encoding="UTF-8"?& ...
随机推荐
- 用同一台PC的两个网口实现Iperf的server端和client端
用同一台PC的两个网口实现Iperf的server端和client端 2015年10月20日 20:35:11 阅读数:2943 有时候需要发包,仅仅需要一定速率的流量,并不需要关心收到报文的大小,一 ...
- Dual Attention Network for Scene Segmentation
Dual Attention Network for Scene Segmentation 原始文档 https://www.yuque.com/lart/papers/onk4sn 在本文中,我们通 ...
- 最小化webpack项目
先把代码贴出来,以后慢慢加说明 参考资料:入门 Webpack,看这篇就够了 / webpack 搭建自动打开,刷新浏览器 一.功能代码1.index.html <!DOCTYPE html&g ...
- eclipse配置逆向工程
eclipse单行注释:ctrl + shfit + c 或者 Ctrl+/: 添加//注释 快速查找某个类:Ctrl+Shift +T 查找这个类的子类是ctrl+t eclips ...
- #error "OpenCV 4.x+ requires enabled C++11 support"解决方法
报错的本质是需要c++11的支持,顾名思义,当前的编译环境是c++11以下的版本.我用的cmake编译,因此再cmakelists文件内添加设置c++标准为14就可以编译通过. )
- 每日一练ACM 2019.0422
Problem Description 根据输入的半径值,计算球的体积. Input 输入数据有多组,每组占一行,每行包括一个实数,表示球的半径. Output 输出对应的球的体积,对于每组输 ...
- 洛谷[LnOI2019]长脖子鹿省选模拟赛 简要题解
传送门 听说比赛的时候T4T4T4标程锅了??? WTF换我时间我要写T3啊 于是在T4T4T4调半天无果的情况下260pts260pts260pts收场真的是tcltcltcl. T1 快速多项式变 ...
- python 实现rsa 的加密解密存读取(PEM格式证书)【转发】
来源:CSDN 原文:https://blog.csdn.net/sjt1996/article/details/83377800
- Java性能优化的50个细节(珍藏版)
原文地址:https://www.toutiao.com/i6595499804082569742/ 在JAVA程序中,性能问题的大部分原因并不在于JAVA语言,而是程序本身.养成良好的编码习惯非常重 ...
- gulp使用入门
介绍:Gulp 是基于node.js的一个前端自动化构建工具,可以使用它构建自动化工作流程(前端集成开发环境):不仅能对网站资源进行优化,而且在开发过程中很多重复的任务能够使用正确的工具自动完成,大大 ...