一、我们之前在hibernate的时候,需要直接写事务,需要绑定当前线程保证获取同一个连接,虽然hibernate的帮我们封装绑定当前现成的操作,但是需要我们手动的去开启和关闭事务。

而spring帮我们自动管理事务。

二:事务:

spring 事务的隔离级别的定义:
   TransactionDefinition
        1. 事务隔离级别的常量
            * static int ISOLATION_DEFAULT                     -- 采用数据库的默认隔离级别
            * static int ISOLATION_READ_UNCOMMITTED
            * static int ISOLATION_READ_COMMITTED
            * static int ISOLATION_REPEATABLE_READ
            * static int ISOLATION_SERIALIZABLE

PROPAGATION(propagation)传播的意思。

因为复杂的业务层之间的调用的话,会出现一个情况就是在业务方法中调用另一个业务方法,而这2个方法之间有事务的操作,针对这种情况,出现了事务的传递行为。

作用:解决业务之间的方法调用

需要掌握的:

      1)PROPAGATION_REQUIRED(默认值):A B两个方法,A中有事务使用A的事务,如果没有B方法开启一个新的事务将A包含进来(B调用A的方法,保证AB在同一个事务中)。这个是默认值。

      2)PROPAGATION_REQUIRES_NEW:--A中有事务,将A中的事务挂起,B创建一个新事物,(保证A B没有在同一个事务)。

      3)PROPAGATION_NESTED(记):嵌套事务,当A执行之后,就会在这个位置设置一个保存点,如果B没有问题,执行通过,如果B出现异常,运行客户根据需求回滚(选择保存丶或者最初状态。)

三、spring事务设置:

接口:1)PlatformTransactionManager:platform平台,即平台事务管理器,该接口有实现类,根据不同的持久框架选择不同的实现类,我们需要关注的是:DataSourceTransactionManager和HibernateTransactionManager

  

  2)TransactionDefinition接口:事务定义信息(事务的隔离级别、传播行为、超时、只读等。)

  3)TransactionStatus接口:事务的状态

总结:上述对象之间的关系:平台事务管理器是真正管理事务的对象的。跟实物的定义信息(transactiondefinition)进行事务的管理,在管理事务中产生一些状态,将状态记录到transactionstatus中。

声明事务方式:两种方式:1)XML配置文件方式、

     2)注解方式。

XML配置文件方式:

1、

  将事务管理器注入到spring中:因为我们使用的jdbc所有使用DataSourceTransactionManager

     <!--配置事务管理器-->
<bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="dataSourceTransactionManager" >
<property name="dataSource" ref="dataSource"/>
</bean>

  需要设置dataSource属性值。

     <property name="dataSource" ref="dataSource"/>

2、配置事务增强:

     <tx:advice id="interceptor" transaction-manager="dataSourceTransactionManager">
<tx:attributes>
<tx:method name="toaccount"/>
</tx:attributes>
</tx:advice>

注意:1)、使用标签<tx:advice>  子标签<tx:attributes> attributes说明可以配置多个tx:method 也就是说可以同时给多个service层的方法添加事务。

   2)、标签:<tx:method> name属性为需要给那个方法添加事务。  propagation属性 传播行为采用Require 默认值(PROPAGATION_REQUIRED),isolation:事务级别,采取默认值,采用本地数据库事务级别。该标签可以写:<tx:method name="toaccount"/> 即可其他的传播行为和

事务级别采用默认值。

   3)、transaction-manager属性是引用那个平台事务管理器的id值,我们使用的jdbc的事务管理器。

3、配置AOP切面:

 <!--配置切面-->
<aop:aspectj-autoproxy expose-proxy="true"/>
<aop:config>
<aop:advisor advice-ref="interceptor" pointcut="execution(public * jd.com.UserService.UserServiceImpl.toaccount(..))"/>
</aop:config>

  1)开启动态代理。

     <aop:aspectj-autoproxy expose-proxy="true"/>

  2)配置切面:使用标签<aop:config> 

     <aop:config>
<aop:advisor advice-ref="interceptor" pointcut="execution(public * jd.com.UserService.UserServiceImpl.toaccount(..))"/>
</aop:config>

  3)注意:我们自己的写增强或者切面类的时候使用<aop:aspect>标签,使用的别人的增强的时候使用<aop:advisor>.

4)编写测试类:

 package jd.com.UserService;

 import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import javax.annotation.Resource; @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class TestDemo { @Resource(name= "userService")
private UserService userService; @Test
public void add(){
System.out.println();
System.out.println(this.userService);
this.userService.toaccount(,);
}
}

service层:

 package jd.com.UserService;

 import jd.com.UserDao.userdao;
import org.springframework.stereotype.Service; import javax.annotation.Resource; public class UserServiceImpl implements UserService { private userdao userdaoIMpl; public void setUserdaoIMpl(userdao userdaoIMpl) {
this.userdaoIMpl = userdaoIMpl;
} @Override
public void toaccount(int mon1, int mon2) { System.out.println(this.userdaoIMpl);
userdaoIMpl.addMoney(mon1);
userdaoIMpl.delMoney(mon2);
}
}

持久层:

 package jd.com.UserDao;

 import javafx.scene.chart.ValueAxis;
import org.apache.commons.dbcp.BasicDataSource;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.stereotype.Repository; import javax.annotation.Resource; public class userdaoIMpl extends JdbcDaoSupport implements userdao { @Override
public void addMoney(int mon) {
System.out.println(this.getDataSource());
System.out.println(this.getJdbcTemplate());
this.getJdbcTemplate().update(" UPDATE t_account SET money = money-? WHERE id = ? ",mon,); } @Override
public void delMoney(int mon) {
this.getJdbcTemplate().update(" UPDATE t_account SET money = money+? WHERE id = ? ",mon,);
}
}

 2、第二种方法:注解方式

1)开启注解

     <!--开启注解-->
<tx:annotation-driven transaction-manager="dataSourceTransactionManager" />
<!--配置切面-->

2)配置管理器:

     <!--配置事务管理器-->
<bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="dataSourceTransactionManager" >
<property name="dataSource" ref="dataSource"/>
</bean

3)在目标类或者目标方法加注解:

 import jd.com.UserDao.userdao;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; public class UserServiceImpl implements UserService { private userdao userdaoIMpl; public void setUserdaoIMpl(userdao userdaoIMpl) {
this.userdaoIMpl = userdaoIMpl;
} @Transactional(isolation= Isolation.DEFAULT ,propagation = Propagation.REQUIRED)
@Override
public void toaccount(int mon1, int mon2) { System.out.println(this.userdaoIMpl);
userdaoIMpl.addMoney(mon1);
userdaoIMpl.delMoney(mon2);
}
}

可以在注解内设置相应的参数 如果不设置可以直接使用@Transactional

 @Transactional(isolation= Isolation.DEFAULT ,propagation = Propagation.REQUIRED)

也可以在类上加注解,那这个类下面的所有方法都受事务影响。

JAVA框架 Spring 事务的更多相关文章

  1. Java框架spring Boot学习笔记(六):Spring Boot事务管理

    SpringBoot和Java框架spring 学习笔记(十九):事务管理(注解管理)所讲的类似,使用@Transactional注解便可以轻松实现事务管理.

  2. Java框架spring 学习笔记(十八):事务管理(xml配置文件管理)

    在Java框架spring 学习笔记(十八):事务操作中,有一个问题: package cn.service; import cn.dao.OrderDao; public class OrderSe ...

  3. Java框架spring 学习笔记(十四):注解aop操作

    回见Java框架spring Boot学习笔记(十三):aop实例操作,这里介绍注解aop操作 首先编写一个切入点HelloWorld.java package com.example.spring; ...

  4. [Spring框架]Spring 事务管理基础入门总结.

    前言:在之前的博客中已经说过了数据库的事务, 不过那里面更多的是说明事务的一些锁机制, 今天来说一下Spring管理事务的一些基础知识. 之前的文章: [数据库事务与锁]详解一: 彻底理解数据库事务一 ...

  5. 05-spring框架—— Spring 事务

    5.1 Spring 的事务管理 事务原本是数据库中的概念,在 Dao 层.但一般情况下,需要将事务提升到业务层,即 Service 层.这样做是为了能够使用事务的特性来管理具体的业务. 在 Spri ...

  6. Java框架spring学习笔记(十七):事务操作

    事务操作创建service和dao类,完成注入关系 service层叫业务逻辑层 dao层单纯对数据库操作层,在dao层不添加业务 假设现在有一个转账的需求,狗蛋有10000元,建国有20000元,狗 ...

  7. Java框架spring 学习笔记(十九):事务管理(注解管理)

    注解管理的方式要比xml配置方式要简单很多 只需在配置文件中添加事务注解 <?xml version="1.0" encoding="UTF-8"?> ...

  8. JAVA 框架 Spring Cache For Redis.

    一.概述 缓存(Caching)可以存储经常会用到的信息,这样每次需要的时候,这些信息都是立即可用的. 常用的缓存数据库: Redis   使用内存存储(in-memory)的非关系数据库,字符串.列 ...

  9. 对Java框架spring、hibernate、Struts的粗浅理解

    对 Struts 的理解:1. struts 是一个按 MVC 模式设计的 Web 层框架,其实它就是一个大大的 servlet,这个Servlet 名为 ActionServlet,或是 Actio ...

随机推荐

  1. django项目一 登录注册

    STATIC_URL = '/static/' STATICFILES_DIRS = [ os.path.join(BASE_DIR,'static') ] AUTH_USER_MODEL = 'cr ...

  2. Tracing 在PeopleSoft 程序中怎么开启

    本文介绍一些常用的跟踪方法在Applications,Application Engine,PeopleSoft,Integration Broker,Cobol中. 1.Application En ...

  3. Android Studio 编译: Program type already present: XXX 解决方案

    3情况1:个例 build.gradle 中 dependencies { classpath 'com.android.tools.build:gradle:3.1.1' // } 改成 depen ...

  4. 大数据【四】MapReduce(单词计数;二次排序;计数器;join;分布式缓存)

       前言: 根据前面的几篇博客学习,现在可以进行MapReduce学习了.本篇博客首先阐述了MapReduce的概念及使用原理,其次直接从五个实验中实践学习(单词计数,二次排序,计数器,join,分 ...

  5. 【three.js练习程序】创建地球贴图

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  6. Bootstrap源码分析系列之整体架构

    作为一名合格的前端工程师,你肯定听说过Bootstarp框架.确实可以说Bootstrap框架是最流行的前端框架之一.可是也有人说Bootstrap是给后端和前端小白用的,我认为只要学习它能给我们前端 ...

  7. Ubuntu 18.04 Server 设置静态IP

    一.背景 Netplan是Ubuntu 17.10中引入的一种新的命令行网络配置实用程序,用于在Ubuntu系统中轻松管理和配置网络设置.它允许您使用YAML抽象来配置网络接口.它可与NetworkM ...

  8. VMWare虚拟机安装Linux系统时安装界面显示不全的解决、Linux分区

    1.只有最下面的按钮不全(可以显示字的一部分):可以用Tab键操控进行下一步 2.只有一半左右的界面:用Alt+鼠标左键移动安装界面 3.关于Linux分区:如果想用Linux进行深入操作,尽量不要选 ...

  9. 一致性Hash(Consistent Hashing)原理剖析

    引入 在业务开发中,我们常把数据持久化到数据库中.如果需要读取这些数据,除了直接从数据库中读取外,为了减轻数据库的访问压力以及提高访问速度,我们更多地引入缓存来对数据进行存取.读取数据的过程一般为: ...

  10. BAT文件语法和技巧

    首先,批处理文件是一个文本文件,这个文件的每一行都是一条DOS命令(大部分时候就好象我们在DOS提示符下执行的命令行一样),你可以使用DOS下的Edit或者Windows的记事本(notepad)等任 ...