JAVA事务回滚

JAVA事务回滚当一个租赁系统在租房服务时我们会判断用户的账户金额是否够支付本次的房费 如果钱够则扣款 在订单表插入一条本次业务相关的数据 这时候如果在订单表插入出现了异常 但是钱已经扣款成功了 这样的情况就可以加入事务回滚 事务回滚将本次的操作都使用同一个 Connection 进行操作 于是加入了 ThreadLocal 存放 Connection 在获取 Connection 时先看一下当前 ThreadLocal 是否存放有 Connection 如果有则直接从里面获取 没有的话就创

        当一个租赁系统在租房服务时我们会判断用户的账户金额是否够支付本次的房费,如果钱够则扣款,在订单表插入一条本次业务相关的数据,这时候如果在订单表插入出现了异常,但是钱已经扣款成功了,这样的情况就可以加入事务回滚。

       事务回滚将本次的操作都使用同一个Connection进行操作,于是加入了ThreadLocal存放Connection

        在获取Connection时先看一下当前ThreadLocal是否存放有Connection,如果有则直接从里面获取,没有的话就创建一个Connection并将其放入ThreadLocal中,本次业务中就直接往里取。

private static ThreadLocal threadLocal = new ThreadLocal();
public static Connection getConnection(){ try { //在ThreadLocal获取Connection conn = (Connection) threadLocal.get(); //如果没有获取到则进入 if (conn==null){ conn = DriverManager.getConnection(url, user, password); //将新建的Connection保存到ThreadLocal中 threadLocal.set(conn); } } catch (SQLException throwables) { throwables.printStackTrace(); } return conn; }

       销毁时则是下图调用closeAll时将Connection传进去。

public static void closeAll(Connection conn, Statement st, ResultSet rs) { try { if (rs != null){ rs.close(); } if (st != null){ st.close(); } if (conn != null){ conn.close(); threadLocal.remove(); } } catch (SQLException throwables) { throwables.printStackTrace(); } }

        将Connection对象设置使用setAutoCommit(false)方法设置手动提交事务,接着进行具体业务的操作,如下判断钱是否够、钱够退款、扣款成功添加订单,底层异常往上抛,如果没有出现异常时就提交事务,出现异常时捕获到则回滚事务,业务结束后调用closeAll把Connection对象关闭,并清除了ThreadLocal里的Connection对象;

Connection conn = DBUtil.getConnection(); try{ conn.setAutoCommit(false);//开始手动提交事务 //具体操作 //判断用户钱是否足够 //钱够则扣款 //扣款成功后添加订单 conn.commit(); //提交事务 }catch (Exception ex){ ex.printStackTrace(); conn.rollback(); //事务回滚 }finally { DBUtil.closeAll(conn,null,null); }

        因为其他业务处理时也要使用到事务回滚,可将事务回滚部分封装代理模式

package com.bjpwoernode.util; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.sql.Connection; public class Agent implements InvocationHandler { private Object service; public Agent(Object service){ this.service = service; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result = null; Connection conn = DBUtil.getConnection(); try{ conn.setAutoCommit(false); result = method.invoke(service,args); conn.commit(); }catch (Exception ex){ ex.printStackTrace(); conn.rollback(); }finally { DBUtil.closeAll(conn,null,null); } return result; } public Object getAgent(){ Object lisi = Proxy.newProxyInstance(service.getClass().getClassLoader(), service.getClass().getInterfaces(), this); return lisi; } } 
package com.bjpwoernode; import com.bjpwoernode.model.Order; import com.bjpwoernode.service.rentingHouseService; import com.bjpwoernode.service.serviceImpl.rentingHouseServiceImpl; import com.bjpwoernode.util.Agent; import java.lang.reflect.InvocationHandler; import java.sql.SQLException; public class MainTest { public static void main(String[] args) { Order order = new Order(); order.setuID(3); order.sethID(2); rentingHouseService rentingHouseService = new rentingHouseServiceImpl(); InvocationHandler agentManager = new Agent(rentingHouseService); rentingHouseService lisi = (rentingHouseService) ((Agent)agentManager).getAgent(); try { int flag = lisi.rentingHouse(order,1300,2); if (flag == 1) System.out.println("租赁成功"); if (flag == 0) System.out.println("权限不足"); if(flag == -1) System.out.println("金币不足请充值"); } catch (SQLException throwables) { throwables.printStackTrace(); } } } 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/178699.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午4:41
下一篇 2026年3月26日 下午4:41


相关推荐

  • 腾讯Hunyuan-MT 7B实战:本地化翻译工具保姆级安装教程

    腾讯Hunyuan-MT 7B实战:本地化翻译工具保姆级安装教程

    2026年3月13日
    2
  • Python 生成随机数_python 随机字符串

    Python 生成随机数_python 随机字符串python中生成随机数主要使用random模块和numpy库中的random函数。前者主要用于生成随机数和实现序列中随机数和随机数列的挑选,后者用来生成a*b维的随机矩阵。一、random模块random模块中将近有7个函数都是可以用来生成随机数,列举如下:1.random.random()功能:随机生成一个[0,1)的浮点数示例:importrandomnumber=random.random()print(number)print(‘%.2f’%num

    2026年4月17日
    7
  • jpeg图像压缩算法流程详解_图像压缩最快算法

    jpeg图像压缩算法流程详解_图像压缩最快算法JPEG是Joint Photographic Exports Group的英文缩写,中文称之为联合图像专家小组。该小组隶属于ISO国际标准化组织,主要负责定制静态数字图像的编码方法,即所谓的JPEG算法。JPEG专家组开发了两种基本的压缩算法、两种熵编码方法、四种编码模式。如下所示:压缩算法:(1)有损的离散余弦变换DCT(Discrete Cosine Transform)(2)无

    2025年7月6日
    5
  • XAMPP安装配置(最)详细教程图解

    XAMPP安装配置(最)详细教程图解XAMPPXampp 安装及使用 XAMPP 包括 Aache MySQL PHP PERL 直接解压缩 没有复杂的安装过程 强烈推荐初学者使用 文章目录 XAMPP 一 XAMPP 简介二 Xampp 安装及使用三 XAMPP 控制面板四 XAMPP 的基本常见使用方法五 卸载 XAMPP 注意事项六 附 xampp 的默认密码七 常见问题一 XAMPP 简介 XAMPP Apache MySQ

    2026年3月17日
    2
  • java 软连接_螺栓软连接与硬链接

    java 软连接_螺栓软连接与硬链接1.Linux链接概念Linux链接分两种,一种被称为硬链接(HardLink),另一种被称为符号链接(SymbolicLink)。默认情况下,ln命令产生硬链接。【硬连接】硬连接指通过索引节点来进行连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(InodeIndex)。在Linux中,多个文件名指向同一索引节点是存在的。一般这种连…

    2026年4月19日
    4
  • filezilla 教程_filezilla怎么登录

    filezilla 教程_filezilla怎么登录FileZilla是一种快速、可信赖的FTP客户端以及服务器端开放程式,具有多种特色、直接的接口。既然提到ftp客户端,那就不得不提iis7。IIS7服务器管理工具中的ftp功能可以实现批量添加服务

    2022年8月2日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号