一、关于是事务

  以方法为单位,进行事务控制;抛出异常,事务回滚。

  最小的执行单位为方法。决定执行成败是通过是否抛出异常来判断的,抛出异常即执行失败

二、声明式事务:

声明式事务(declarative transaction management)是Spring提供的对程序事务管理的方式之一。
Spring的声明式事务顾名思义就是采用声明的方式来处理事务。这里所说的声明,就是指在配置文件中声明。用在Spring配置文件中声明式的处理事务来代替代码式的处理事务。这样的好处是,事务管理不侵入开发的组件,具体来说,业务逻辑对象就不会意识到正在事务管理之中,事实上也应该如此,因为事务管理是属于系统层面的服务,而不是业务逻辑的一部分,如果想要改变事务管理策划的话,也只需要在定义文件中重新配置即可;在不需要事务管理的时候,只要在设定文件上修改一下,即可移去事务管理服务,无需改变代码重新编译,这样维护起来极其方便。
Spring使用AOP来完成声明式的事务管理,因而声明式事务是以方法为单位,Spring的事务属性自然就在于描述事务应用至方法上的策略,在Spring中事务属性有以下四个参数:
1.传播行为
3.只读提示
4.事务超时期间

三、案例:编程实现购买股票的业务

 

  1.编写实体类

  2.编写dao层接口和实现

  3.编写service层接口和实现

public class StockServiceImpl implements IStockService{
private IStockDao stockDao;
private IAccountDao accountDao; public void setStockDao(IStockDao stockDao) {
this.stockDao = stockDao;
} public void setAccountDao(IAccountDao accountDao) {
this.accountDao = accountDao;
} @Override
public void buyStock(int sid, double scount, int aid, double abalance) {
boolean isBuy = true;
stockDao.updateStock(sid,scount,isBuy);
accountDao.updateAccount(aid,abalance,isBuy);
}
@Override
public void sellStock(int sid, double scount, int aid, double abalance) {
boolean isBuy = false;
stockDao.updateStock(sid,scount,isBuy);
accountDao.updateAccount(aid,abalance,isBuy);
}
}

  4.编写applicationContext.xml引入架包

    (1)没有加入事务的xml文件

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="database.properties"/>
</bean>
<!--配置jdbc数据源-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="url" value="${jdbc.url}"></property>
<property name="driverClassName" value="${jdbc.driver}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
<!--注册jdbcTemplate-->
<bean id="jbdcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--注册dao实现-->
<bean id="accountDao" class="cn.bank.dao.impl.AccountDaoImpl">
<property name="jdbcTemplate" ref="jbdcTemplate"/>
</bean>
<bean id="stockDao" class="cn.bank.dao.impl.StockDaoImpl">
<property name="jdbcTemplate" ref="jbdcTemplate"/>
</bean>
<!--注册service实现-->
<bean id="stockService" class="cn.bank.service.impl.StockServiceImpl">
<property name="accountDao" ref="accountDao"/>
<property name="stockDao" ref="stockDao"/>
</bean>

    功能测试:

@Test
public void buyStock(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
IStockService stockService = (IStockService) context.getBean("stockService");
stockService.buyStock(1001,1000,1204,10000);
}

(此处没有关联股票价格)

  (2)加入异常测试

@Override
public void buyStock(int sid, double scount, int aid, double abalance) {
boolean isBuy = true;
stockDao.updateStock(sid,scount,isBuy);
if (1==1) {
int i = 5 / 0;
}
accountDao.updateAccount(aid,abalance,isBuy);
}

  报错:

  处理结果:

  在执行一次:

  现在我们可以看到,在增加股票和减少余额中间产生异常之后,股票增加而余额没有减少,这种现在肯定是错误的。

  (3)添加事务管理

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--通过bean元素生命需要Spring创建的实例。该实例的类型通过class属性指定,
并通过id属性为该实例制定一个名称,以便于访问-->
<!--引入数据库配置文件-->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="database.properties"/>
</bean>
<!--配置jdbc数据源-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="url" value="${jdbc.url}"></property>
<property name="driverClassName" value="${jdbc.driver}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
<!--注册jdbcTemplate-->
<bean id="jbdcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--注册dao实现-->
<bean id="accountDao" class="cn.bank.dao.impl.AccountDaoImpl">
<property name="jdbcTemplate" ref="jbdcTemplate"/>
</bean>
<bean id="stockDao" class="cn.bank.dao.impl.StockDaoImpl">
<property name="jdbcTemplate" ref="jbdcTemplate"/>
</bean>
<!--注册service实现-->
<bean id="stockService" class="cn.bank.service.impl.StockServiceImpl">
<property name="accountDao" ref="accountDao"/>
<property name="stockDao" ref="stockDao"/>
</bean>
<!--引入事务平台管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--事务拦截处理:使用代理工厂-->
<bean id="serviceProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="target" ref="stockService"/>
<property name="transactionManager" ref="transactionManager"/>
<!--事务参数的设定-->
<property name="transactionAttributes">
<props>
<prop key="buyStock">ISOLATION_DEFAULT,PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
</beans>

  测试(修改getBean()方法的参数):

@Test
public void buyStockTest(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
IStockService stockService = (IStockService) context.getBean("serviceProxy");
stockService.buyStock(1001,1000,1204,10000);
}

  异常发生,数据没有改变(是我们预期的结果,也是业务需要的):

    最后,去掉异常,保证事务管理下业务功能正常:

四:业务实现正常

Spring学习笔记:声明式事务管理增删改查业务的更多相关文章

  1. Spring—SSJ集成&声明式事务管理

    1.   课程介绍 1.  SSJ集成;(掌握) 2.  声明式事务管理;(掌握) 什么是三大框架 2.1.  ssh Struts/Struts2 Spring Hibernate 2.2.  ss ...

  2. Spring学习之声明式事物管理

    public List<Student> selectStudent() { Student s = new Student(); s.setName("zhengbin&quo ...

  3. spring+mybatis之声明式事务管理初识(小实例)

    前几篇的文章都只是初步学习spring和mybatis框架,所写的实例也都非常简单,所进行的数据访问控制也都很简单,没有加入事务管理.这篇文章将初步接触事务管理. 1.事务管理 理解事务管理之前,先通 ...

  4. ASP.NET学习笔记(3)——用户增删改查(三层)

    说明(2017-10-6 11:21:58): 1. 十一放假在家也没写几行代码,本来还想着利用假期把asp.net看完,结果天天喝酒睡觉,回去的票也没买到,惨.. 2. 断断续续的把用户信息的页面写 ...

  5. C学习笔记-结构体与二进制文件增删改查

    使用结构体整理数据,然后利用二进制存储文件,这样存储的文件类似于数据库,可以实现文件的增删改查 定义结构体 struct student { unsigned int ID; char name[20 ...

  6. Android学习笔记_9_SQLiteOpenHelper对象之数据库增删改查以及事务回滚操作

    一.SQLite数据库: 在Android平台上,集成了一个嵌入式关系型数据库—SQLite,SQLite3支持 NULL.INTEGER.REAL(浮点数字).TEXT(字符串文本)和BLOB(二进 ...

  7. 【EF学习笔记04】----------EF简单增删改查

    第一步:创建上下文对象 using(var db = new Entities()) { //数据操作 } 新增 UserInfo user = new UserInfo() { UserName = ...

  8. mongo学习笔记(一):增删改查

    安装:我是按这篇来弄的 一.Insert 1.db.person.insert({"name":"jack","age":20}) 2.va ...

  9. ASP.NET学习笔记(2)——用户增删改查

    说明(2017-7-4 11:48:50): 1. index.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transition ...

随机推荐

  1. Elasticsearch学习(2) windows环境下Elasticsearch同步mysql数据库

    在上一章中,我们已经能够通过spring boot来使用Elasticsearch,但是由于我们习惯性的将数据写入mysql,所以为了解决这个问题,Elasticsearch为我们提供了一个插件log ...

  2. python 特性:height-->while

    """ 出题:height 女生找对象 男生在1米-1.5米之间 小强你在哪里? 男生在1.5-1.7米之间 没有安全感 男生在1.7 - 1.8米之间 帅哥 留个电话 ...

  3. bzoj1875 HH去散步

    题目链接 一开始特别天真, $Folyd$传递闭包写了一下过了样例就交上去了 然后$gg$ $qwq$ 想了想$……$ 还要写一点东西 最后统计答案的时候有细节要注意 /*************** ...

  4. memcached服务

    介绍 它是一套数据缓存系统或软件 用于动态应用系统中缓存数据库的数据,减少数据库的访问压力,达到提升性能的效果,实际应用环境中多用于数据库的cache的应用.它是通过预分配指定的内存空间来存储数据 定 ...

  5. [ActionScript 3.0] 用TextField的方法getCharIndexAtPoint(x:Number, y:Number):int实现文字在固定范围内显示

    有时候我们遇到一行文字过多时必须固定文字的显示范围,但由于中英文所占字节数不一样,所以不能很好的用截取字符的方式去统一显示范围的大小,用TextField的getCharIndexAtPoint(x: ...

  6. 实现反转的方法(reverse)

    1.最简单的方法: public static String reverse1(String str) { return new StringBuffer(str).reverse().toStrin ...

  7. JS 与 OC 交互

    WebView与JS的几种交互 IOS中 使用JavaScriptCore 实现OC与JS的交互 JavaScriptCore 使用

  8. redis安全(加入密码)

    一.前言 在使用云服务器时,安装的redis3.0+版本都关闭了protected-mode,因而都遭遇了挖矿病毒的攻击,使得服务器99%的占用率!! 因此我们在使用redis时候,最好更改默认端口, ...

  9. thinkphp5.0升级

    之前一些项目是thinkphp5.0的版本.这个版本是有严重漏洞的.根据官方建议会把Request.php下面的 method方法做一个替换.但是实际上为了安全最好是做一个升级.首先必须要先做一个备份 ...

  10. UBoot常用命令及内核下载与引导

    一.常用命令 1. 获取帮助 ① help 或 ? 2. 环境变量与相关命令 (1)环境变量 ① bootdely ② baudrate ③ netmask ④ ethaddr ⑤ bootfile ...