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"?& ...
随机推荐
- 微信小程序云端解决方案探索之路 - GITC 主题演讲
转自:https://github.com/tencentyun/blog/issues/1 在刚结束的全球互联网技术大会(GITC)里面,我在前端专场给大家分享了「微信小程序云端解决方案探索之路」, ...
- 《笨方法学Python》加分题32
注意一下 range 的用法.查一下 range 函数并理解它在第 22 行(我的答案),你可以直接将 elements 赋值为 range(0, 6) ,而无需使用 for 循环?在 python ...
- NOIP2018游记(划掉) 滚粗记
Day0 早上摸鱼~, 打几个板子就颓废 中午出发, 在火车上颓元气+睡觉. 到了宾馆发现yhx已经帮我们拿了袋子和狗牌,于是上楼欢乐地搓起了六家统, 一直搓到10点钟才回自己房间. 有六家统就有快乐 ...
- python写注册
# coding = UTF-8 注释格式 import datetime 引用日期 today = datetime.datetime.today().strftime("%Y-%m-%d ...
- PM学习梳理--业务流程和流程图介绍
- Eclipse 使用 ButterKnife 细节问题
原本这都是很常见的功能 加入以下jar库就可以了. 哪里知道左右都不能获得点击时间; http://repo1.maven.org/maven2/com/jakewharton/butterknife ...
- mysql-5.7.17-winx64 的安装配置
在Mysql中下载 解压后,没有安装,需要设置环境变量,设置my.ini配置 设置环境变量 操作如下: 1)右键单击我的电脑->属性->高级系统设置(高级)->环境变量 点 ...
- Oracle获取异常的具体出处dbms_utility.format_error_backtrace
DBMS_UTILITY.FORMAT_ERROR_BACKTRACE :返回当前异常相应的描述,通过它就能知道异常的最初生成处. 系统为最近一次生成的异常设置了一个栈,并跟踪它的传递过程,而这个 ...
- 重写toFixed()方法
1.直接在原型上修改,仍然使用元调用方式 Number.prototype.toFixed = function (exponent) { return parseInt(this * Math.po ...
- IDEA的相关使用-----快捷键
转:https://blog.csdn.net/qq_35091777/article/details/80988165 IntelliJ Idea 常用快捷键列表 Alt+回车 导入包,自动修正Ct ...