我的编程空间,编程开发者的网络收藏夹
学习永远不晚

PostgreSql JDBC事务操作方法详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

PostgreSql JDBC事务操作方法详解

JDBC事务相关方法简介

本文将借助示例,简单讲解下JDBC操作Pg事务的流程。

首先来简单讲解下事务的定义:为了确保两个(多个)数据库操作都生效,或者两个操作都不发生,可以使用事务。根据定义,事务是作为单个单元执行的一组语句。换句话说,要么所有语句都成功执行,要么没有执行。

禁用自动提交模式

当建立与PostgreSQL数据库的连接时,它处于自动提交模式。这意味着每个SQL语句都被视为事务并自动提交。

如果要在事务中封装一个或多个语句,则必须禁用自动提交模式。为此,我们可以调用Connection.setAutoCommit()方法来修改SQL提交模式:

Connection.setAutoCommit(false);

最佳做法是仅对事务模式禁用自动提交模式。它避免为多个语句保留数据库锁。

提交事务

要提交事务,请调用Connection对象的commit方法,如下所示:

Connection.commit();

当调用commit()方法,所有前面的SQL语句作为一个单元一起提交。

回滚事务

既然使用了事务,那我们肯定会有回滚的时候,我们可以使用rollback()方法来中止当前事务并将值恢复为原始值。

Connection.rollback();

PostgreSQL JDBC 事务示例

让我们举一个使用JDBC API执行PostgreSQL事务的示例。

首先,创建一个表示ProRank的实体类,如下所示:

import lombok.Data;
@Data
public class ProRank {
    Integer id;
    String name;
    String team;
    String line;
    Integer rank;
}

然后,编写以下代码,供我们测试事务操作。

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import Java.sql.*;
@SpringBootTest
class JdbcTrasationTests {
    private final String url = "jdbc:p6spy:postgresql://localhost:5432/postgres";
    private final String user = "postgres";
    private final String password = "112233";
    
    public Connection connect() throws SQLException {
        return DriverManager.getConnection(url, user, password);
    }
    @Test
    void testTrasation() {
        ProRank proRank = new ProRank();
        proRank.setLine("Mid");
        proRank.setName("Faker");
        proRank.setTeam("T1");
        proRank.setRank(0);
        //调用
        addProAndUpdateRank(proRank,2222);
    }
    
    private void close(AutoCloseable closeable) {
        try {
            if (closeable != null) {
                closeable.close();
            }
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
    
    public void addProAndUpdateRank(ProRank proRank, Integer rank) {
        Connection conn = null;
        PreparedStatement pstmt = null;
        PreparedStatement pstmt2 = null;
        ResultSet rs = null;
        // 插入一条数据
        String SQL = "INSERT INTO pro_rank(name,team,line,rank) VALUES(?,?,?,?)";
        // 更新他的rank值
        String SQLUpdateRank = "UPDATE pro_rank SET rank = ? WHERE id = ?;";
        int id = 0;
        try {
            // 链接数据库
            conn = connect();
            conn.setAutoCommit(false);
            // 插入一条数据
            pstmt = conn.prepareStatement(SQL, Statement.RETURN_GENERATED_KEYS);
            pstmt.setString(1, proRank.getName());
            pstmt.setString(2, proRank.getTeam());
            pstmt.setString(3, proRank.getLine());
            pstmt.setInt(4, proRank.getRank());
            int affectedRows = pstmt.executeUpdate();
            // 判断是否生效
            if (affectedRows > 0) {
                // 获取返回的id
                rs = pstmt.getGeneratedKeys();
                if (rs.next()) {
                    id = rs.getInt(1);
                    if (id > 0) {
                        pstmt2 = conn.prepareStatement(SQLUpdateRank);
                        pstmt2.setInt(2, id);
                        pstmt2.setInt(1, rank);
                        pstmt2.executeUpdate();
                    }
                }
            } else {
                // 如果新增数据失败,回滚
                conn.rollback();
            }
            // 提交事务
            conn.commit();
            System.out.println("插入选手数据成功!更新选手rank成功,数据id:" + id);
        } catch (SQLException sqlException) {
            System.out.println(sqlException.getMessage());
            sqlException.printStackTrace();
            // 回滚事务
            System.out.println("回滚事务...");
            try {
                if (conn != null) {
                    conn.rollback();
                }
            } catch (SQLException e) {
                System.out.println(e.getMessage());
                e.printStackTrace();
            }
        } finally {
            close(rs);close(pstmt);close(pstmt2);close(conn);
        }
    }
}

让我们看一下上面的代码,他包含三个方法

connect() 方法建立与数据库连接,并返回连接对象。

close() 方法关闭数据库操作可关闭的对象,如Resultset、Statement和Connection。

addProAndUpdateRank()方法插入新的选手,并在事务中更新选手的rank字段。此方法包含逻辑如下:

  • 首先,在pro_rank表中插入一条新的选手数据。
  • 接下来,获取新插入的选手数据的id
  • 然后,更新插入选手的rank值。
  • 之后,如果步骤2和3均成功,则提交事务。否则,回滚事务
  • 最后,关闭ResultSet、PreparedStatement和Connection对象。

如果我们在第一个场景中执行程序,我们会得到以下结果:

插入选手数据成功!更新选手rank成功,数据id:14

PostgreSql JDBC事务操作方法详解

我们可以通过查询pro_rank表格,来查看上述代码执行结果:

SELECT * FROM "public"."pro_rank" LIMIT 1000 OFFSET 0;

PostgreSql JDBC事务操作方法详解

现在,让我们测试一下事务回滚的情况,比如,我们可以在插入一条数据的时候,将name字段赋值为超出数据库长度的字串,运行程序结果如下:

PostgreSql JDBC事务操作方法详解

ERROR: value too long for type character varying(7)

PostgreSql JDBC事务操作方法详解

事务将回滚,并且没有任何内容插入pro_rank表

以上就是PostgreSql JDBC事务操作方法详解的详细内容,更多关于PostgreSql JDBC事务操作的资料请关注我们其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

PostgreSql JDBC事务操作方法详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

PostgreSql JDBC事务操作方法详解

目录JDBC事务相关方法简介禁用自动提交模式提交事务回滚事务PostgreSQL JDBC 事务示例JDBC事务相关方法简介本文将借助示例,简单讲解下JDBC操作Pg事务的流程。首先来简单讲解下事务的定义:为了确保两个(多个)数据库操作
2022-11-19

mysql事务管理操作详解

本文实例讲述了mysql事务管理操作。分享给大家供大家参考,具体如下: 本文内容:什么是事务管理事务管理操作回滚点默认的事务管理首发日期:2018-04-18什么是事务管理:可以把一系列要执行的操作称为事务,而事务管理就是管理这些操作要么完
2022-05-23

PostgreSQL数据库事务插入删除及更新操作的方法

这篇文章主要介绍了PostgreSQL数据库事务插入删除及更新操作的方法的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇PostgreSQL数据库事务插入删除及更新操作的方法文章都会有所收获,下面我们一起来看看吧
2023-06-29

python操作redis事务的方法

这篇文章主要讲解了“python操作redis事务的方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“python操作redis事务的方法”吧!五大数据类型及应用场景类型特点使用场景stri
2023-06-03

详解C#操作XML的方法总结

这篇文章主要为大家详细介绍了C#对XML文件进行一些基本操作的方法,譬如:生成xml文件、修改xml文件的节点信息等,需要的可以参考一下
2022-11-13

C#操作INI文件的方法详解

INI文件全称是InitializationFile的缩写,即初始化文件,是windows系统的系统配置文件所采用的存储格式,统管windows的各项配置。本文介绍了C#操作INI文件的方法,需要的可以参考一下
2022-11-13

React使用refs操作DOM方法详解

React核心就在于虚拟DOM,也就是在React中不总是直接操作页面真实的DOM元素,并且结合Diffing算法,可以做到最小化页面重绘,有些时候不可避免的我们需要一种方法可以操作我们定义的元素标签,并作出对应的修改。在React中提供了一种访问DOM节点的方式,也就是这里的refs
2022-11-13

详解Golang中的除法取整操作方法

Golang除法取整的方法详解一、介绍在Golang编程中,对于除法运算有时需要取整的操作。如果想要将一个浮点数除以另一个浮点数并把结果取整,可使用Golang提供的math包中的相关函数。二、向下取整向下取整是指将一个数值向下舍入到最
详解Golang中的除法取整操作方法
2024-01-29

编程热搜

目录