|NO.Z.00090|——————————|BigDataEnd|——|Java&MySQL.JDBC.V15|——|MySQL.v15|Jdbc开发_控制事务API介绍|代码演示|

一、JDBC控制事务API介绍
### --- 之前我们是使用 MySQL 的命令来操作事务。接下来我们使用 JDBC 来操作银行转账的事务。

——>        数据准备
    -- 创建账户表
    CREATE TABLE account(
        -- 主键
        id INT PRIMARY KEY AUTO_INCREMENT,
        -- 姓名
        NAME VARCHAR(10),
        -- 转账金额
        money DOUBLE
        );

    -- 添加两个用户
    INSERT INTO account (NAME, money) VALUES ('tom', 1000), ('jack', 1000);
### --- 事务相关API

——>        我们使用 Connection中的方法实现事务管理
方法 说明
void setAutoCommit(boolean
autoCommit)
参数是 true 或 false 如果设置为 false,表示关闭自动提交,相
当于开启事务
void commit()  提交事务
void rollback()  回滚事务
### --- 开发步骤

——>        1. 获取连接
——>        2. 开启事务
——>        3. 获取到 PreparedStatement , 执行两次更新操作
——>        4. 正常情况下提交事务
——>        5. 出现异常回滚事务
——>        6. 最后关闭资源
二、代码示例
public class JDBCTransaction {
    //JDBC 操作事务
    public static void main(String[] args) {
        
        Connection con = null;
        PreparedStatement ps = null;
        
        try {

            //1. 获取连接
            con = JDBCUtils.getConnection();

            //2. 开启事务
            con.setAutoCommit(false);

            //3. 获取到 PreparedStatement 执行两次更新操作
            //3.1 tom 账户 -500
            ps = con.prepareStatement("update account set money = money - ? where name = ? ");
            ps.setDouble(1,500.0);
            ps.setString(2,"tom");
            ps.executeUpdate();

            //模拟tom转账后 出现异常
            System.out.println(1 / 0);

            //3.2 jack 账户 +500
            ps = con.prepareStatement("update account set money = money + ? where name = ? ");
            ps.setDouble(1,500.0);
            ps.setString(2,"jack");
            ps.executeUpdate();
            
            //4. 正常情况下提交事务
            con.commit();
            System.out.println("转账成功!");
            
        } catch (SQLException e) {
            e.printStackTrace();
            try {

                //5. 出现异常回滚事务
                con.rollback();
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
            
        } finally {
            //6. 最后关闭资源
            JDBCUtils.close(con,ps);
        }
    }
}
三、sql语句
package com.yanqi.jdbc05;

        import com.yanqi.jdbc05.JdbcUtils;

        import java.sql.Connection;
        import java.sql.PreparedStatement;
        import java.sql.SQLException;

public class JdbcTransaction {

    //使用JDBC操作事务
    public static void main(String[] args) {

        Connection con = null;
        PreparedStatement ps = null;

        try {
            //1.获取连接
            con = JdbcUtils.getConnection();

            //2.开启事务
            con.setAutoCommit(false);  //手动提交事务

            //3.获取预处理对象 执行SQL (两次修改操作)
            //3.1 tom账户 - 500
            ps = con.prepareStatement("update account set money = money - ? where name = ?");
            ps.setDouble(1,500.0);
            ps.setString(2,"tom");
            ps.executeUpdate();

            //模拟 tom转账之后出现异常
            System.out.println(1 / 0);

            //3.2 jack账户 + 500
            ps = con.prepareStatement("update account set money = money + ? where name = ?");
            ps.setDouble(1,500.0);
            ps.setString(2,"jack");
            ps.executeUpdate();

            //4.提交事务 (正常情况)
            con.commit();
            System.out.println("转账成功! !");

        } catch (SQLException e) {
            e.printStackTrace();
            //5.出现异常就回滚事务
            try {
                con.rollback();
            } catch (SQLException ex) {
                ex.printStackTrace();
            }

        } finally {
            //6.释放资源
            JdbcUtils.close(con,ps);
        }

    }

}

 
 
 
 
 
 
 
 
 

Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart
                                                                                                                                                   ——W.S.Landor

 

posted on   yanqi_vip  阅读(15)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示