zoukankan      html  css  js  c++  java
  • JDBC——JDBC中的事务、DBUtils使用事务

    什么是事务

    1.概述:事务指的是逻辑上的一组操作,组成这组操作的单元,要不同时成功,要不同时失败
    2.作用:保证在一个事务中,多次SQL操作要么同时成功,要么同时失败
    

    JDBC操作事务

    *事务管理流程
        1.开启事务
        2.执行多条SQL语句,如果没有出现错误,提交事务,将数据持久化存储到数据库
        3.执行多条SQL语句,如果出现错误,回滚事务,将事务状态回滚到开启事务之前
        4.关闭资源
    *JDBC事务操作
        与事务操作相关的方法,都定义在java.sql.Connection接口中
        public void setAutoCommit(boolean flag):将此连接的自动提交模式为给定状态的flag
            **当flag=true:表示自动提交   
            **当flag=fasle:表示手动提交,开启事务
        public void commit():将数据持久化提交到数据库
        public void rollback: 回滚事务
        
    *步骤:
        1.获取Conection连接对象
        2.开启事务 setAutoCommit(false)
        3.定义sql语句
        4.获取PreparedStatement对象
        5.执行sql语句,获得结果
        6.如果sql语句正常执行,没有问题,提交事务
        7.处理结果
        8.如果sql语句执行错误,回滚事务
        9.关闭资源
    *代码体现:
        public class Jdbc_affairDemo8 {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement pstmt1 = null;
        PreparedStatement pstmt2 = null;
    
        //1. 获取连接
        try {
            conn = JDBCUtils.getConnection();
            // 建立连接后开启事务
            conn.setAutoCommit(false);
    
            //2. 定义sql
            //2.1 张三 - 500
            String sql1 = "update account set balance = balance - ? where id = ?";
            //2.2 李四 + 500
            String sql2 = "update account set balance = balance + ? where id = ?";
    
            //3. 获取执行的sql对象
            pstmt1 = conn.prepareStatement(sql1);
            pstmt2 = conn.prepareStatement(sql2);
    
            //4. 设置参数
            pstmt1.setDouble(1, 500);
            pstmt1.setInt(2, 1);
    
            pstmt2.setDouble(1, 500);
            pstmt2.setInt(2, 2);
    
            //5. 执行sql
            pstmt1.executeUpdate();
            // 手动制造异常
            int i = 3 / 0;
            pstmt2.executeUpdate();
    
            // 提交事务
            conn.commit();
    
        } catch (SQLException e) {
            // 事务回滚
            if (conn != null) {
                try {
                    conn.rollback();
                } catch (SQLException e1) {
                    e1.printStackTrace();
                }
            }
            e.printStackTrace();
        } finally {
            JDBCUtils.close(pstmt1, conn);
            JDBCUtils.close(pstmt2, null);
        }
    }
    

    }

  • 相关阅读:
    js中属性点.和中括号[]的关系。
    jQuery中的$(window).load()与$(document).ready()以及jquery $(document).ready() 与window.onload的区别
    今天中了一个脚本病毒。把我的所有 html 加了 vbs 脚本,WriteData 是什么鬼?
    原生js 当前时间 倒计时代码
    一看就懂得移动端rem布局、rem如何换算
    使用CSS实现三栏自适应布局(两边宽度固定,中间自适应)
    js运算符的一些特殊应用
    中文目录对 sublime text 有什么影响?
    Spring的注解@Qualifier小结
    伪共享(False Sharing)
  • 原文地址:https://www.cnblogs.com/linjing111/p/12723014.html
Copyright © 2011-2022 走看看