spring事务管理(xml配置)与spring自带连接数据库JdbcTemplate

  什么是事务,很通俗的话来说就是,我们日常生活中总会出现在银行转账的业务,加入A向B转账100元,此时A的账户中应该减少100元,B的账户中增加100元,但是如果在A转完账B还没有接受的时候,服务器出现了故障,一般银行的系统都会给出交易失败的提示,并且A的账户中总金额也不会变,那么这就类似一个事务。

  1.事务是单个逻辑单元工作单位执行的一系列操作

  2.多个操作作为整体向系统提交,要么都执行,要么都不执行

  3.事务时一个不可分割的逻辑单元

事务的4大特性:原子性、一致性、隔离性、持久性(ACID)

下边我就模拟一个银行转账的事务:

首先导入依赖

<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.1.0.RELEASE</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>5.1.0.RELEASE</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-beans -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>5.1.0.RELEASE</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-expression -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-expression</artifactId>
            <version>5.1.0.RELEASE</version>
        </dependency>
        <!--以上4个是spring的核心-->
        <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjrt -->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>1.9.2</version>
        </dependency>
        <!--以上两个是aop依赖-->
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-tx -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>5.1.0.RELEASE</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
        <!--spring自带的数据库连接依赖-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.1.0.RELEASE</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <!--mysql数据库依赖-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.32</version>
        </dependency>

dao层接口

  

1 public interface AccountDao {
2     void addmonkey();//向表中增加金额
3     void submonkey();//向表中减少金额
4 }

dao层实现类

 1 //dao层实现类需要继承JdbcDaoSupport,这是spring自带的数据库操作
 2 public class AccountDaoImpl extends JdbcDaoSupport implements AccountDao {
 3     @Override
 4     public void addmonkey() {
 5         //id为1的用户总金额增加100
 6         String sql="update account set accountmonkey=accountmonkey+100 where accountid=1";
 7         this.getJdbcTemplate().update(sql);
 8     }
 9
10     @Override
11     public void submonkey() {
12         //id为2的用户总金额减少100
13         String sql="update account set accountmonkey=accountmonkey-100 where accountid=2";
14         this.getJdbcTemplate().update(sql);
15     }
16 }

service层接口

public interface AccountService {
    void changeMonkey();
}

service实现类

public class AccountServiceImpl implements AccountService {
    private AccountDao dao;
    @Override
    public void changeMonkey() {
        dao.submonkey();//A先转账给B
        int result=5/0;//模拟异常,再调用完加钱的时候。
        dao.addmonkey();//B接收money
    }

    public AccountDao getDao() {
        return dao;
    }

    public void setDao(AccountDao dao) {
        this.dao = dao;
    }
}

实体类

1 public class Account {
2     private int accountid;
3     private String accountname;
4     private Double accountmonkey;
5     //省略set,get方法
6 }

增强类

//增强类
public class BeforeAdvice implements MethodBeforeAdvice, AfterReturningAdvice {
    @Override
    public void before(Method method, Object[] objects, Object o) throws Throwable {
        System.out.println("前置增强");
    }

    @Override
    public void afterReturning(Object o, Method method, Object[] objects, Object o1) throws Throwable {
        System.out.println("后置增强");
    }
}

测试类

1 public class Test {
2     public static void main(String[] args) {
3         ApplicationContext context = new ClassPathXmlApplicationContext("/applictionContext.xml");
4         AccountService bean = context.getBean(AccountService.class);
5         bean.changeMonkey();
6     }
7 }

核心配置文件applicationContext.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
 4        xmlns:context="http://www.springframework.org/schema/context"
 5        xmlns:aop="http://www.springframework.org/schema/aop"
 6        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
 7     <!--引入外部文件,将数据库配置文件引入到本文件中-->
 8     <context:property-placeholder location="classpath:database.properties"/>
 9     <!--dao层-->
10     <bean id="dao" class="dao.impl.AccountDaoImpl">
11         <!--注入数据源-->
12         <property name="dataSource" ref="dataSource"/>
13     </bean>
14     <!--向容器中添加service层实现类-->
15     <bean id="service" class="service.impl.AccountServiceImpl">
16         <property name="dao" ref="dao"/>
17     </bean>
18     <!--向容器中添加通知的实现类-->
19     <bean id="advice1" class="advice.BeforeAdvice"></bean>
20     <!--顾问包装通知-->
21     <bean id="advisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
22         <property name="advice" ref="advice1"/>
23         <property name="mappedName" value="say"/>
24     </bean>
25     <!--顾问代理生成器-->
26     <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
27         <property name="beanNames" value="service"/>
28         <property name="interceptorNames" value="advisor"/>
29     </bean>
30     <!--数据源,使用的数据源是spring自带的,讲道理这个自带的数据源不怎么好-->
31     <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
32         <property name="username" value="${jdbc.username}"/>
33         <property name="password" value="${jdbc.password}"/>
34         <property name="url" value="${jdbc.url}"/>
35         <property name="driverClassName" value="${jdbc.driver}"/>
36     </bean>
37     <!--配置事务管理器-->
38     <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
39         <property name="dataSource" ref="dataSource"/>
40     </bean>
41     <!--通知,tx标签是配置事务用的。propagation:事物的管理级别,isolation:事务的传播行为-->
42     <tx:advice transaction-manager="transactionManager" id="ad" >
43         <tx:attributes>
44             <tx:method name="changeMonkey" propagation="REQUIRED" isolation="READ_COMMITTED"/>
45         </tx:attributes>
46     </tx:advice>
47     <aop:config>
48         <aop:pointcut id="pointcut" expression="execution(* service.*.*(..))"/>
49         <aop:advisor advice-ref="ad" pointcut-ref="pointcut"/>
50     </aop:config>
51 </beans>

这里呢一个简单的事务就已经配置好了。

原文地址:https://www.cnblogs.com/Tiandaochouqin1/p/10466915.html

时间: 2024-11-04 01:00:08

spring事务管理(xml配置)与spring自带连接数据库JdbcTemplate的相关文章

spring 事务管理的配置方式

Spring是SSH中的管理员,负责管理其它框架,协调各个部分的工作.今天一起学习一下Spring的事务管理.Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource.TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分. DataSource.TransactionManager这两部分只是会根据数据访问方式有所变化,比如使用Hibernate进行数据访问时,DataSource实际为SessionFactory,Tra

Spring事务管理的配置

spring-datasource-config.xml配置事务 <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <tx:annota

Spring 事务管理的使用

Spring提供了2种事务管理 编程式的 声明式的(重点):包括xml方式.注解方式(推荐) 基于转账的demo dao层 新建包com.chy.dao,包下新建接口AccountDao.实现类AccountDaoImpl: public interface AccountDao { //查询用户账户上的余额 public double queryMoney(int id); //减少用户账户上的余额 public void reduceMoney(int id, double amount);

Spring事务管理--多个ORM框架在使用时的情况分析

公司的项目已经接近尾声了,总结一下项目中用到的技术,我发现项目中的有些东西还是挺模糊的,只是知道这么用就行了.并不清楚其中的原理.由于公司的项目比较老,是7年前的一个项目了,中间一直有人在维护,也是在这个过程中不断融入了新的东西,比如就项目的持久化这块来说,就用了ibatis.mybatis.hibernate.spring JDBC四种混合的框架.究其原因只能说是历史遗留问题,就不做过多的解释了.但是这么多持久化的框架如何协同工作的,尤其是事务的控制,一个系统中使用如此多的持久化框架是,他们是

spring事务管理学习

spring事务管理学习 spring的事务管理和mysql自己的事务之间的区别 参考很好介绍事务异常回滚的文章 MyBatis+Spring 事务管理 spring中的事务回滚例子 这篇文章讲解了@Transaction注解事务和<tx:tags>方式的声明式事务的优缺点 Spring3核心技术之事务管理机制 这篇文章介绍了spring 事务管理的源码 spring源码分析之——spring 事务管理实现方式 揭开Spring事务处理 一般而言dao层是对单张表进行的操作,而service层

Spring事务管理--[基于XML的配置]

我觉得自己写的不好,所以先贴一个写的好的帖子 感觉看完不用回来了.... 这是一个大佬写的的博客 : https://www.cnblogs.com/yixianyixian/p/8372832.html 第一:JavaEE 体系进行分层开发,事务处理位于业务层,Spring 提供了分层设计业务层的事务处理解决方 案. 第二:spring 框架为我们提供了一组事务控制的接口.具体在后面的第二小节介绍.这组接口是在 spring-tx-5.0.2.RELEASE.jar 中. 第三:spring

Spring事务管理-使用注解配置事务

一.概述 事务管理对于企业应用来说是至关重要的,即使出现异常情况,它也可以保证数据的一致性.Spring Framework对事务管理提供了一致的抽象,其特点如下:为不同的事务API提供一致的编程模型,比如JTA(Java Transaction API), JDBC, Hibernate, JPA(Java Persistence API和JDO(Java Data Objects)支持声明式事务管理,特别是基于注解的声明式事务管理,简单易用 提供比其他事务API如JTA更简单的编程式事务管理

spring 事务管理配置

一般的,我们把事务配在service层,利用service的业务逻辑接口统一的管理. 为什么不用在dao层呢? 因为一个service有可能调用多个dao,而这多个dao有可能相互联系,有时候一个操作需要调用多次数据库,但是这多次调用要么全提交,要么全回滚. 因此,在dao层调用事务理论上说不是一个很明智的选择.应该有业务逻辑层service层负责事务,统一处理. Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource.TransactionManager和代理机制这三

Spring声明式事务管理与配置介绍

转至:http://java.9sssd.com/javafw/art/1215 [摘要]本文介绍Spring声明式事务管理与配置,包括Spring声明式事务配置的五种方式.事务的传播属性(Propagation).Spring事务的隔离级别(Isolation level)等内容. 一.Spring声明式事务配置的五种方式 前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识.通过这次的学习发觉Spring的事务配置只要把

Spring 事务管理-只记录xml部分

1.手动配置事务的方式是 applicationContext.xml <?xml version="1.0" encoding="UTF-8" ?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi