spring学习JdbcTemplate数据库事务管理

 更新时间:2022年05月30日 10:25:08   作者:把苹果咬哭的测试笔记  
这篇文章主要为大家介绍了spring学习JdbcTemplate数据库事务管理,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

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数据库事务的资料请关注脚本之家其它相关文章!

相关文章

  • Java中正则表达式的使用和详解(下)

    Java中正则表达式的使用和详解(下)

    这篇文章主要介绍了Java正则表达式的使用和详解(下)的相关资料,包括常用正则表达式和正则表达式语法,非常不错,具有参考借鉴价值,需要的的朋友参考下吧
    2017-04-04
  • Java中Iterator迭代器的简单理解

    Java中Iterator迭代器的简单理解

    这篇文章主要介绍了Java中Iterator迭代器的简单理解,Iterator接口也是Java集合中的一员,但它与Collection、Map接口有所不同,Iterator主要用于迭代访问Collection中的元素,因此Iterator对象也被称为迭代器,需要的朋友可以参考下
    2024-01-01
  • idea中如何集成http请求

    idea中如何集成http请求

    这篇文章主要介绍了idea中如何集成http请求问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • java数据结构之实现双向链表的示例

    java数据结构之实现双向链表的示例

    这篇文章主要介绍了java数据结构实现双向链表的示例,需要的朋友可以参考下
    2014-03-03
  • springcloud本地调试feign调用出现的诡异404问题及解决

    springcloud本地调试feign调用出现的诡异404问题及解决

    这篇文章主要介绍了springcloud本地调试feign调用出现的诡异404问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • 深入理解java三种工厂模式

    深入理解java三种工厂模式

    下面小编就为大家带来一篇深入理解java三种工厂模式。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-06-06
  • Java实现把文件及文件夹压缩成zip

    Java实现把文件及文件夹压缩成zip

    这篇文章主要介绍了Java实现把文件及文件夹压缩成zip,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • Java Swing GroupLayout分组布局的实现代码

    Java Swing GroupLayout分组布局的实现代码

    这篇文章主要介绍了Java Swing GroupLayout分组布局的实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • Spring Boot Web 静态文件缓存处理的方法

    Spring Boot Web 静态文件缓存处理的方法

    本篇文章主要介绍了Spring Boot Web 静态文件缓存处理的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-02-02
  • 详解SpringBoot如何自定义自己的Starter组件

    详解SpringBoot如何自定义自己的Starter组件

    这篇文章主要为大家详细介绍了在SpringBoot中如何自定义自己的Starter组件,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-03-03

最新评论