• JDBC:处理事务


    1、如何实现事务

    如果现在希望对 A 表和 B 表同时删除某一个 id 号的记录,使这两个sql操作组成一个事务。(成功则同时成功,否则都失败)

    注意:如果 B 表 建立了引用 A 表的id外键,并指定为 on delete cascade, 此时在删除 A 表中的id号时,会自动把对应的 B 表中的id号记录删除。

    实践:同时删除course和teacher表中id号为5的记录;

    package com.dgd.test;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    
    public class Test01 {
        public static void main(String[] args) throws ClassNotFoundException, SQLException {
            //①注册驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
    
            //url
            String url="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT";
            //②获取连接
            Connection conn = DriverManager.getConnection(url, "root", "123456");
            System.out.println(conn.getClass());
    
            //③*****设置手动提交事务
            conn.setAutoCommit(false);
    
            //编写sql语句 1
            String sql1="DELETE FROM course where id=?";
            //编写sql语句 2
            String sql2="DELETE FROM teacher where id=?";
    
            //④创建 PreparedStatement 对象
            PreparedStatement s1 = conn.prepareStatement(sql1);
            PreparedStatement s2 = conn.prepareStatement(sql2);
            //设置 ? 值
            s1.setObject(1,"5");
            s2.setObject(1,"5");
    
            boolean flag1=true;//
            boolean flag2=true;// sql执行的标志位
    
            try {
                //⑥执行sql语句
                int len1=s1.executeUpdate();
                System.out.println(len1>0?"删除course表成功":"删除course表失败");
                if(len1<0)
                {
                    flag1=false;
                }
    
                if(flag1==true)
                {
                    int len2=s2.executeUpdate();
                    System.out.println(len2>0?"删除teacher表成功":"删除teacher表失败");
                    if(len2<0) {
                        flag2=false;
                    }
                }
                if(flag1==true && flag2==true)
                    conn.commit();
                else
                    conn.rollback();
            } catch (SQLException e) {
                System.out.println("发生异常");
                conn.rollback();
            }
    
    
            //⑦关闭资源
            s1.close();
            s2.close();
            conn.setAutoCommit(true); //⑧还原
            conn.close();
        }
    }

    当故意估计修改错 sql 语句(删除id 4)时,判断是否会回滚;

            //编写sql语句 1
            String sql1="DELETE FROM course where id=?";
            //编写sql语句 2
            String sql2="DELETE FROM teacher  id=?";
    
            //④创建 PreparedStatement 对象
            PreparedStatement s1 = conn.prepareStatement(sql1);
            PreparedStatement s2 = conn.prepareStatement(sql2);
            //设置 ? 值
            s1.setObject(1,"4");
            s2.setObject(1,"4");

    虽然显示course表删除成功,但是实际上回滚,并没有实际提交;

    course表中仍然存在id: 4

  • 相关阅读:
    Puppet报错汇总
    卖买股票的最佳收益
    JavaScript遍历JSON对象数据的方法
    网络IO模型
    STL pair类型的介绍
    JavaScript 代码执行顺序
    每日一练:#0001找出单独出现的数字
    更新GitHub项目出现There is no tracking information for the current branch. Please specify which branch you want to merge with. 怎么解决
    为什么MySQL数据库要用B+树存储索引?
    Node.js 获取本机Mac地址
  • 原文地址:https://www.cnblogs.com/lemonzhang/p/12796616.html
Copyright © 2020-2023  润新知