当前位置: 首页 > news >正文

Jdbc手动实现事务管理

序言

我们平常工作中用到的spring框架中的事务的管理是通过@Transcational注解来控制的声明式事务管理,其底层是通过关闭事务自动提交,手动提交事务来实现事务控制。

JdbcTranscational.java

import java.sql.*; public class JdbcTranscational { /** * mysql连接url */ private static final String URL = "jdbc:mysql://127.0.0.1:3306/test"; /** * 数据库连接账号名 */ private static final String USER = "root"; /** * 数据库连接密码 */ private static final String PASSWORD = "123456"; /** * mysql数据库驱动类名 */ private static final String DRIVER_NAME = "com.mysql.jdbc.Driver"; /** * @return java.sql.Connection * @Author cuizx * @Description 获取数据库连接 * @Date 2019/8/23 21:39 * @Param [] **/ private Connection getConnection() { Connection conn = null; try { //加载mysql驱动类 Class.forName(DRIVER_NAME); //获取数据库连接 conn = DriverManager.getConnection(URL, USER, PASSWORD); } catch (Exception e) { e.printStackTrace(); } return conn; } /** * @return void * @Author cuizx * @Description 按照连接方式倒序关闭所有连接 * @Date 2019/8/23 21:42 * @Param [conn, stmt, resultSet] **/ private void closeConnection(Connection conn, Statement stmt, ResultSet resultSet) { try { if (resultSet != null) { resultSet.close(); } if (stmt != null) { stmt.close(); } if (conn != null) { conn.close(); } } catch (Exception e) { e.printStackTrace(); } } /** * @Author cuizx * @Description 执行sql * @Date 2020/11/21 * @Param [sql] * @return void **/ public void executeSql(String sql) { Statement stmt = null; int result = 0; Connection connection = getConnection(); try { //JDBC中默认是true,自动提交事务(这里手动成false) connection.setAutoCommit(false); //创建声明 stmt = connection.createStatement(); //执行sql result = stmt.executeUpdate(sql); System.out.println("执行结果:" + result); //提交事务 connection.commit(); } catch (Exception e) { try { //抛错后回滚 connection.rollback(); } catch (SQLException e1) { } } finally { closeConnection(connection, stmt, null); } } public static void main(String[] args) { String sql = "select * from user"; String insertSql = "insert into user (id,userName) values('123','cuizx')"; String updateSql = "update user set userName ='更新后' where id ='123'"; String deleteSql = "delete from user where id ='123'"; JdbcTranscational jdbcTranscational = new JdbcTranscational(); jdbcTranscational.executeSql(insertSql); jdbcTranscational.executeSql(updateSql); jdbcTranscational.executeSql(deleteSql); } }

pom.xml

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.jdbctranscational</groupId> <artifactId>jdbctranscational</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <!-- 导入Mysql数据库链接jar包 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.30</version> </dependency> </dependencies> </project>

以上便是事务控制的手动实现代码,其中最核心的部分是关闭事务自动提交和异常后事务回滚

1:jdbc中autocommit默认为true,每次sql执行都会自动提交事务,而我们如果要自己来控制事务的话,就必须将autocommit设置为false

2:connection.rollback(),在catch块中进行事务的回滚,也就是我们平常所知的抛出异常进行事务回滚

http://www.jsqmd.com/news/826122/

相关文章:

  • 深入PEX8796:从Serdes到Virtual Switch,图解PCIe交换芯片的三种工作模式
  • FPGA开发板GT远端环回测试:原理、配置与调试实战指南
  • RAG是什么?为什么Agent必须用RAG?
  • pgwatch2在Kubernetes中的部署:Helm Chart完全解析
  • Cursor AI编程助手规则文件(.cursorrules)配置指南与最佳实践
  • AI+Web3开发实战:Helius Core-AI如何赋能Solana智能体应用
  • 大语言模型可解释性实战:从注意力可视化到特征归因的深度解析
  • SDLPAL资源文件格式详解:从RIX到YJ1的压缩技术
  • 产品经理面试与求职攻略:Awesome Product Management 职业转型成功案例
  • Spoolman与主流3D打印软件的完美集成:OctoPrint、Klipper、Moonraker详细配置教程
  • 亲身经历从申请密钥到成功调用Taotoken API的全流程耗时与难易度
  • 上下文工程:从提示词到智能体,高效管理AI交互的核心方法论
  • AlphaAvatar:从单目视频重建可驱动3D数字人的混合表示框架
  • Veyra Forms:React生态下声明式、类型安全的复杂表单状态管理框架
  • AI Gateway:统一调度多模型API,实现成本优化与性能监控
  • VSCode插件开发利器:cursor_info库实现光标上下文精准解析
  • 200类鸟类图像分类数据集
  • t-io HTTP服务器实现:如何替代Tomcat和Jetty的完整指南
  • 本地大模型运行、训练、微调全搞定,4GB RAM轻松运行4B模型!
  • msphpsql高级功能深度解析:Always Encrypted、数据分类和表值参数全面指南
  • Python-ADB协议实现原理:深入理解ADB和Fastboot通信机制
  • 构建个人知识库:从代码仓库到第二大脑的实践指南
  • FS8024A芯片实现USB-C PD诱骗:打造TYPE-C转DC电源转接头方案
  • AI LED调光驱动电源智能功率 MOSFET 完整选型方案
  • Blender FLIP Fluids域设置详解:如何优化模拟精度与性能
  • AI智能体钩子模式:用JSON Schema构建标准化交互协议
  • SDLPAL图形渲染技术揭秘:OpenGL与Shader的完美结合
  • DevUI布局系统完全指南:响应式设计的终极解决方案
  • 基于知识图谱构建个人第二大脑:从原理到实践
  • GraphQL-WS服务器配置:完整参数详解与最佳实践