spring学习JdbcTemplate数据库事务管理

目录
  • spring JdbcTemplate数据库事务管理
    • 一、spring 中的事务管理
    • 二、spring 事务管理 API
    • 三、使用事务管理
      • 1. 配置文件
      • 2. 类上添加事务注解

spring JdbcTemplate数据库事务管理

现在有个账户表,里面存着用户金额。

如果要真正地做好转账的操作,就要用到事务,否则当出现异常后会出现数据不一致等问题。

try {
  // 第一步 开启事务
  // 第二步 进行业务操作
  // 第三步 没有发生异常,提交事务
} catch(){
  // 第四步 发生异常,事务回滚
}

一、spring 中的事务管理

通常,把事务加在 service 层(业务逻辑层)。

而在 spring 中管理事务可以有 2 种方式实现:

  • 编程式管理:就像上面伪代码那样,这种使用起来不方便。
  • 声明式管理:通过配置方式实现,推荐使用。其中,可以基于 XML 方式进行配置,也可以基于注解,显然后者更方便。

在 spring 中进行声明式事务管理,底层使用的是 AOP 原理。

二、spring 事务管理 API

spring 提供了一个接口 PlatformTransactionManager ,代表事务管理器。此接口针对不同的框架提供不同的实现类。

利用idea工具,展开结构,使用 jdbcTemplate 用到的是 DataSourceTransactionManager 。

三、使用事务管理

1. 配置文件

创建事务管理器。

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!--注入数据源-->
        <property name="dataSource" ref="dataSource"></property>
    </bean>

开启事务注解,使用名称空间 tx

<!--开启事务注释-->
    <tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>

2. 类上添加事务注解

注解 @Transactional 可以加在 service 类上,也可以加到方法上:

加到类上,表示类下所有的方法都添加了事务。加到方法,表示只有该方法添加事务。

@Service
@Transactional
public class UserService {
    @Autowired
    private UserDao userDao;
    // 转账方法
    public void accountMoney() {
        // 大周 少 100
        userDao.reduceMoney();
        // 模拟异常
        int i = 1/0;
        // 小毛 加 100
        userDao.addMoney();
    }
}

接口实现类 UserDaoImpl 。

@Repository
public class UserDaoImpl implements UserDao {
    @Autowired
    private JdbcTemplate jdbcTemplate;
    @Override
    public void addMoney() {
        String sql = "update t_account set money=money+? where username=?";
        jdbcTemplate.update(sql, 100, "小毛");
    }
    @Override
    public void reduceMoney() {
        String sql = "update t_account set money=money-? where username=?";
        jdbcTemplate.update(sql, 100, "大周");
    }
}

到测试类里执行一下:

public class TestTrans {
    @Test
    public void testJdbc() {
        ApplicationContext context =
                new ClassPathXmlApplicationContext("bean1.xml");
        UserService userService = context.getBean("userService", UserService.class);
        userService.accountMoney();
    }
}

注意,上面的 service 里我手动添加了异常,所以执行后,事务应该是要回滚操作,2 个人的金额仍然各是 1000 。

八月 07, 2021 10:39:57 上午 com.alibaba.druid.pool.DruidDataSource info
信息: {dataSource-1} inited
java.lang.ArithmeticException: / by zero

刷新数据表。

现在我去掉 service 类中的异常 int i = 1/0;,重新执行测试方法:

八月 07, 2021 10:47:01 上午 com.alibaba.druid.pool.DruidDataSource info
信息: {dataSource-1} inited
Process finished with exit code 0

刷新数据表。

结果正确。

以上就是spring学习JdbcTemplate数据库事务管理的详细内容,更多关于spring JdbcTemplate数据库事务的资料请关注我们其它相关文章!

(0)

相关推荐

  • 详解在spring中使用JdbcTemplate操作数据库的几种方式

    使用JdbcTemplate的步骤 1.设置spring-jdbc和spring-tx的坐标(也就是导入依赖) <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.2.7.RELEASE</version> </dependency> <dependency&

  • SpringBoot使用JdbcTemplate访问操作数据库基本用法

    目录 一.建一个rumenz_springboot库 二.加入pom的依赖 三.SpringBoot配置文件 四.创建User实体类 五.Service接口 六.Service接口实现类 七.Controller测试 八.总结 Spring对数据库的操作在jdbc上s面做了深层次的封装,使用spring的注入功能,可以把DataSource注册到JdbcTemplate之中. JdbcTemplate在Spring-jdbc包下面,还需要Spring-tx包支持,里面包含事务和异常控制. 一.建

  • Spring学习JdbcTemplate数据库事务参数

    目录 Spring JdbcTemplate数据库事务参数 一.propagation 1. REQUIRED 2. REQUIRES_NEW 3. SUPPORTS 4. NOT_SUPPORTED 5. MANDATORY 6. NEVER 7. NESTED 二.ioslation 三.timeout 四.readOnly 五.rollbackFor 六.noRollbackFor Spring JdbcTemplate数据库事务参数 @Transactional() 注解里有不少参数,其

  • SpringBoot使用JdbcTemplate操作数据库

    前言 本文是对SpringBoot使用JdbcTemplate操作数据库的一个介绍,提供一个小的Demo供大家参考. 操作数据库的方式有很多,本文介绍使用SpringBoot结合JdbcTemplate. 新建项目 新建一个项目.pom文件中加入Jdbc依赖,完整pom如下: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM

  • Spring boot 使用JdbcTemplate访问数据库

    SpringBoot 是为了简化 Spring 应用的创建.运行.调试.部署等一系列问题而诞生的产物, 自动装配的特性让我们可以更好的关注业务本身而不是外部的XML配置,我们只需遵循规范,引入相关的依赖就可以轻易的搭建出一个 WEB 工程 Spring Framework 对数据库的操作在 JDBC 上面做了深层次的封装,通过 依赖注入 功能,可以将 DataSource 注册到 JdbcTemplate 之中,使我们可以轻易的完成对象关系映射,并有助于规避常见的错误,在 SpringBoot

  • Spring框架JdbcTemplate数据库事务管理完全注解方式

    目录 Spring JdbcTemplate事务注解 配置类方式配置 完全注解方式 一.创建配置类 二.测试注解方式的事务管理 Spring JdbcTemplate事务注解 配置类方式配置 在之前的操作中,相关的配置还是写在了 xml 配置文件中.现在,使用配置类的方式进行配置. <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework

  • spring学习JdbcTemplate数据库事务管理

    目录 spring JdbcTemplate数据库事务管理 一.spring 中的事务管理 二.spring 事务管理 API 三.使用事务管理 1. 配置文件 2. 类上添加事务注解 spring JdbcTemplate数据库事务管理 现在有个账户表,里面存着用户金额. 如果要真正地做好转账的操作,就要用到事务,否则当出现异常后会出现数据不一致等问题. try { // 第一步 开启事务 // 第二步 进行业务操作 // 第三步 没有发生异常,提交事务 } catch(){ // 第四步 发

  • MyBatis在Spring环境下的事务管理

    MyBatis的设计思想很简单,可以看做是对JDBC的一次封装,并提供强大的动态SQL映射功能.但是由于它本身也有一些缓存.事务管理等功能,所以实际使用中还是会碰到一些问题--另外,最近接触了JFinal,其思想和Hibernate类似,但要更简洁,和MyBatis的设计思想不同,但有一点相同:都是想通过简洁的设计最大限度地简化开发和提升性能--说到性能,前段时间碰到两个问题: 1.在一个上层方法(DAO方法的上层)内删除一条记录,然后再插入一条相同主键的记录时,会报主键冲突的错误. 2.某些项

  • 详解Java的Spring框架中的事务管理方式

    数据库事务是被当作单个工作单元的操作序列.这些操作要么全部完成或全部不成功.事务管理是面向企业应用程序,以确保数据的完整性和一致性RDBMS中的重要组成部分.事务的概念可以用下面的描述为ACID四个关键属性来描述: 原子性: 一个事务应该被视为单个操作单元表示的操作的任一整个序列是成功的或不成功的. 一致性: 这代表了数据库的参照完整性,在桌等唯一主键的一致性 隔离性: 可能有很多事务处理相同的数据集的同时,每个事务都应由他人隔离,以防止数据损坏. 持久性: 一旦事务完成,本次事务的结果必须作出

  • Spring与Hibernate整合事务管理的理解

    在谈Spring事务管理之前我们想一下在我们不用Spring的时候,在Hibernate中我们是怎么进行数据操作的.在Hibernate中我们每次进行一个操作的的时候我们都是要先开启事务,然后进行数据操作,然后提交事务,关闭事务,我们这样做的原因是因为Hibernate默认的事务自动提交是false,他是需要我们人为的手动提交事务,假如你不想每次都手动提交事务的话,你可以在hibernate.cfg.xml我文件中把它设置为事务自动提交: xml代码 <property name="def

  • spring实现jdbctemplate添加事务支持示例

    复制代码 代码如下: public interface JdbcTemplate extends JdbcOperations {public abstract void beginTranstaion(); public abstract void commit(); public abstract void rollback();} 复制代码 代码如下: public class JdbcTemplateImpl extends org.springframework.jdbc.core.J

  • 详解Spring学习之声明式事务管理

    前言 在前面的小节中,我们学习了关于事务的概念以及事务管理的重要性,并且通过编程使用Spring的编程式事务管理进行操作,加深对事务管理的重要性的学习,不过,由于编程式的事务管理使用起来不是很方便,所以在日常的开发中基本不怎么使用,接下来的内容我们将学习使用Spring的声明式事务管理,这里有一个地方需要明白的是,Spring的声明式事务管理的实现方式其实是通过AOP的方式来实现的,也就是为原始的事务管理对象创建代理对象,从而实现事务管理增强的 基于TransactionProxyFactory

  • 详解Spring学习之编程式事务管理

    前言 在前面的内容,基本已经学习了事务的基本概念以及事务隔离级别等,接下来的几个小节,将学习怎么使用Spring进行事务管理,在Spring中,对事务进行管理有多种方法,主要分别编程式和声明式,本小节主要学习编程式事务管理,后面讲学习Spring的声明式事务管理 编程式事务管理 所谓的编程式事务管理,其实就是通过编写代码的方式来进行事务管理,也就是通过将事务管理的代码硬编码在代码中从而达到事务管理的作用,不过Spring的事务管理不同于JDBC原始的事务管理,在JDBC中,对事务进行管理首先要关

  • Spring中事务管理的四种方法(银行转账为例)

    前言 本文配套示例代码下载地址(完整可运行,含sql文件,下载后请修改数据库配置):点击这里下载 一.事务的作用 将若干的数据库操作作为一个整体控制,一起成功或一起失败. 原子性:指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生. 一致性:指事务前后数据的完整性必须保持一致. 隔离性:指多个用户并发访问数据库时,一个用户的事务不能被其他用户的事务所干扰,多个并发事务之间数据要相互隔离. 持久性:指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,即时数据库发生故障也不应

随机推荐