JAVAEE框架之Spring事务

简介: JAVAEE框架之Spring事务

JAVAEE框架之Spring

八.Spring事务

8.1 转账业务

AccountServiceImple 转账业务实现类代码

/**
     * 转账业务
     * @param sourceId
     * @param targetId
     * @param money
     */
    public void transfer(Integer sourceId, Integer targetId,Double money) {
        //1.根据id,查询转出账户
        Account source=accountDao.selectAccount(sourceId);
        //2.根据id,查询转入账户
        Account target=accountDao.selectAccount(targetId);
        //3.转出账户减钱
        source.setMoney(source.getMoney()-money);
        //4.转入账户加钱
        target.setMoney(target.getMoney()+money);
        //5.更新转出账户
        accountDao.updateAccount(source);
        //6.更新转入账户
        accountDao.updateAccount(target);
    }

8.2测试

ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        //2.获取Spring的bean
        AccountService accountService = (AccountService) ac.getBean("accountService");
        //3.2 测试转账业务
        accountService.transfer(1,2,1111.0);

结果成功!!!

但是如果在转账业务类步骤5 6之间出现各种异常情况如何呢?(断点、异常代码等)

这里模拟int result=i/0;

问题发现转出账户已经扣钱了,而转入账户则没有得到相应的金额。

8.3 线程连接工具类

package com.aaa.util;
import javax.sql.DataSource;
import java.sql.Connection;
/**
 * Created by 张晨光 on 2020/7/4 11:42
 * 连接的工具类,用于从数据源中获取连接,并且实现和线程的绑定
 */
public class ConnUtils {
    private ThreadLocal<Connection> threadLocal=new ThreadLocal<Connection>();
    private DataSource dataSource;
    public void setDataSource(DataSource dataSource) {
        this.dataSource = dataSource;
    }
    /**
     * 获取线程上的连接
     * @return
     */
    public Connection getThreadConnection(){
        try {
            //1.从threadLocal获取本地链接对象
            Connection conn=threadLocal.get();
            //2.判断当前线程上是否有链接;
            if(conn==null){
                //3.从数据源中获取链接对象,存入threadLocal中
                conn=dataSource.getConnection();
                threadLocal.set(conn);
            }
            //4.返回当前线程上的链接;
            return conn;
        } catch (Exception e) {
           throw new RuntimeException(e);
        }
    }
    /**
     * 解绑连接对象和线程
     */
    public void removeConnection(){
        threadLocal.remove();
    }
}

8.4 事务管理类

package com.aaa.util;
import java.sql.SQLException;
/**
 * Created by 张晨光 on 2020/7/4 11:53
 */
public class TransactionManager {
    //调用连接管理类
    private ConnUtils connUtils;
    public void setConnUtils(ConnUtils connUtils) {
        this.connUtils = connUtils;
    }
    /**
     * 设置开始的时候自动提交事务为false,变为手动提交;
     */
    public void beginTransaction(){
        try {
            connUtils.getThreadConnection().setAutoCommit(false);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    /**
     * 自动提交事务
     */
    public void commit(){
        try {
            connUtils.getThreadConnection().commit();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    /**
     * 回滚事务
     */
    public void rollback(){
        try {
            connUtils.getThreadConnection().rollback();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    /**
     * 释放连接
     */
    public void release(){
        try {
            connUtils.getThreadConnection().rollback();
            connUtils.removeConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

8.5 Spring自带事务类

<bean id="tx" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>
<tx:annotation-driven transaction-manager="tx"/>

转账业务类

@Service("accountService")
@Transactional
public class AccountServiceImpl implements AccountService


目录
相关文章
|
26天前
|
数据采集 监控 前端开发
二级公立医院绩效考核系统源码,B/S架构,前后端分别基于Spring Boot和Avue框架
医院绩效管理系统通过与HIS系统的无缝对接,实现数据网络化采集、评价结果透明化管理及奖金分配自动化生成。系统涵盖科室和个人绩效考核、医疗质量考核、数据采集、绩效工资核算、收支核算、工作量统计、单项奖惩等功能,提升绩效评估的全面性、准确性和公正性。技术栈采用B/S架构,前后端分别基于Spring Boot和Avue框架。
|
1月前
|
Java API 数据库
Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐
本文通过在线图书管理系统案例,详细介绍如何使用Spring Boot构建RESTful API。从项目基础环境搭建、实体类与数据访问层定义,到业务逻辑实现和控制器编写,逐步展示了Spring Boot的简洁配置和强大功能。最后,通过Postman测试API,并介绍了如何添加安全性和异常处理,确保API的稳定性和安全性。
38 0
|
18天前
|
Java 开发者 Spring
Spring高手之路24——事务类型及传播行为实战指南
本篇文章深入探讨了Spring中的事务管理,特别是事务传播行为(如REQUIRES_NEW和NESTED)的应用与区别。通过详实的示例和优化的时序图,全面解析如何在实际项目中使用这些高级事务控制技巧,以提升开发者的Spring事务管理能力。
32 1
Spring高手之路24——事务类型及传播行为实战指南
|
30天前
|
前端开发 Java 数据库连接
Spring 框架:Java 开发者的春天
Spring 框架是一个功能强大的开源框架,主要用于简化 Java 企业级应用的开发,由被称为“Spring 之父”的 Rod Johnson 于 2002 年提出并创立,并由Pivotal团队维护。
46 1
Spring 框架:Java 开发者的春天
|
12天前
|
XML Java 数据库连接
Spring中的事务是如何实现的
Spring中的事务管理机制通过一系列强大的功能和灵活的配置选项,为开发者提供了高效且可靠的事务处理手段。无论是通过注解还是AOP配置,Spring都能轻松实现复杂的事务管理需求。掌握这些工具和最佳实践,能
17 3
|
22天前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,帮助开发者提高开发效率和应用的可维护性。
40 2
|
22天前
|
消息中间件 NoSQL Java
springboot整合常用中间件框架案例
该项目是Spring Boot集成整合案例,涵盖多种中间件的使用示例,每个案例项目使用最小依赖,便于直接应用到自己的项目中。包括MyBatis、Redis、MongoDB、MQ、ES等的整合示例。
80 1
|
30天前
|
Java 数据库连接 开发者
Spring 框架:Java 开发者的春天
【10月更文挑战第27天】Spring 框架由 Rod Johnson 在 2002 年创建,旨在解决 Java 企业级开发中的复杂性问题。它通过控制反转(IOC)和面向切面的编程(AOP)等核心机制,提供了轻量级的容器和丰富的功能,支持 Web 开发、数据访问等领域,显著提高了开发效率和应用的可维护性。Spring 拥有强大的社区支持和丰富的生态系统,是 Java 开发不可或缺的工具。
|
Java Spring
spring框架之AOP模块(面向切面),附带通知类型---超详细介绍
spring框架之AOP模块(面向切面),附带通知类型---超详细介绍
123 0
|
缓存 监控 Java
Spring框架之AOP(面向切面编程)
Spring框架之AOP(面向切面编程)
58 0
下一篇
无影云桌面