Mysql学习--06.JDBC事务

版权声明:转载请注明原始链接 https://blog.csdn.net/sswqzx/article/details/82731676

学习目标

Mysql事务操作

JDBC事务操作

一、Mysql事务操作

事务 Transaction : 将一组 sql 语句作为一个整体, 要成功, 一起成功, 如果失败, 全部失败.

1、准备数据 :

CREATE TABLE account (

    id INT PRIMARY KEY AUTO_INCREMENT,

    name VARCHAR(10),

    money DOUBLE

);

-- 添加数据

INSERT INTO account (name, money) VALUES ('Jack', 1000), ('Rose', 1000);

2、MySQL 的事务操作 :

MySQL 数据库将每条 SQL 指令设置默认设置为 `自动提交`. 一旦指令提交, 数据库中的数据就会发生 `永久性` 的改变.

  1. 开启事务.  start transaction;  开启事务其实开启 MySQL 数据库的 `手动提交`.
  2. 提交事务.  commit;
  3. 回滚事务.  rollback;

 

一旦事务开启后, 无论最终调用的是 `commit / rollback`, 该事务都结束了.

 

 

二、JDBC的事务操作

1、JDBC 的事务操作 :

请问 : Java中 JDBC 操作数据库, 将事务交给了哪个类的对象呢 ???  Connection连接对象

  1. setAutoCommit(false); 不要自动提交, 就是开启事务.
  2. commit();   成功, 执行提交.
  3. rollback(); 失败, 执行回滚.

代码实现 :

public class TransactionTest1 {
    public static void main(String[] args) {

        /*
        JDBC 中交给了 Connection 对象.
        1. setAutoCommit(false); 不要自动提交
        2. commit(); 提交.
        3. rollback(); 回滚.
         */

        // 1. 模拟数据
        String outUser = "Jack";
        String inUser = "Rose";
        int money = 1000;

        Connection conn = null;
        PreparedStatement stmt = null;

        try {
            // 2. 建立连接
            conn = JDBCUtils.getConnection();

            // 第一步 : 开启事务
            conn.setAutoCommit(false);

            // 3. 操作数据
            // 3.1 转出
            String sql1 = "update account set money = money - ? where name = ?;";
            // 预编译
            stmt = conn.prepareStatement(sql1);
            // 设置参数
            stmt.setInt(1, money);
            stmt.setString(2, outUser);
            // 执行
            int count = stmt.executeUpdate();
            System.out.println("count = " + count);

            // int num = 10 / 0;  // Arithmetic Exception 算术异常

            // 3.2 转入
            String sql2 = "update account set money = money + ? where name = ?;";
            // 预编译
            stmt = conn.prepareStatement(sql2);
            // 设置参数
            stmt.setInt(1, money);
            stmt.setString(2, inUser);
            // 执行
            count = stmt.executeUpdate();
            System.out.println("count = " + count);

            // 第二步 : 提交事务
            conn.commit();

            System.out.println("转账成功!");

        } catch (Exception e) {
            e.printStackTrace();

            // 第三步 : 回滚事务
            try {
                conn.rollback();
            } catch (SQLException e1) {
                e1.printStackTrace();
            }

            System.out.println("转账失败!");
        } finally {
            // 4. 释放资源
            JDBCUtils.release(conn, stmt);
        }
    }
}

 

 

 

猜你喜欢

转载自blog.csdn.net/sswqzx/article/details/82731676