java小白的学习笔记 JDBC控制事物的转账案例

JDBC中事物是什么:

概念:事务是指一组操作,要么都执行成功,要么都执行失败。

四大特性:

      1)原子性:一组操作,要么都执行成功,要么都执行失败。

       2)隔离性:在所有操作未完成之前,其他回话是不能看到中间过程的。

       3)一致性:事物发生和发生后的总金额依然匹配。

        4)持久性:事务产生的影响是不能撤销的。

为什么需要进行事物处理:

       如果在程序执行中出现错误,已经执行的sql语句将会改变数据库数据,但后续sql语句并未执行,会造成数据被错误改变,例如银行转账中,张三给李四转账500块,但因为系统突发错误张三账户上减少500元,但李四并未收到500,造成这500凭空消失,这时就需要进行事物处理,将张三转账500和李四接收500操作放在一个事务下进行管理,正常情况全部执行,如果有异常出现,则回滚事务。

转张案例代码编写:
1.不使用事物:

public static void main(String[] args) throws Exception {
    //注册驱动 从JDK1.6之后,JDBC的版本已经是4.0,可以不用手动注册驱动了。
    Class.forName("com.mysql.jdbc.Driver");

    //获取连接 这里MySQL用的是5.5版本
    //MySQL8.0版本之后url语句为:jdbc:mysql://localhost:3306/数据库名称?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
    String url = "jdbc:mysql://localhost:3306/db1";

    //写入数据库账号密码
    Connection conn = DriverManager.getConnection(url, "root", "root");

    // 编写sql
    // 张三给李四转张500 张三id=1 李四id=2
    String sql = "update account set money = money - 500 where id = 1";
    String sql1 = "update account set money = money + 500 where id = 2";

    // 获取执行sql对象
    Statement statement = conn.createStatement();

    // 执行sql
    int i = statement.executeUpdate(sql);
    //0不能作为分母 程序运行到这里会报错
    System.out.println(100 / 0);
    int i1 = statement.executeUpdate(sql1);

    // 输出受影响行数
    System.out.println(i);
    System.out.println(i1);

    // 关闭资源

    statement.close();
    conn.close();
}

运行前sql数据库数据:

运行后sql数据库数据:

 这里可以看见张三账户中钱减少了,但是李四并没有增加。

2.使用事物:

public static void main(String[] args) throws ClassNotFoundException {
    Connection conn = null;
    Statement statement = null;
    try {
        //注册驱动 从JDK1.6之后,JDBC的版本已经是4.0,可以不用手动注册驱动了。
        Class.forName("com.mysql.jdbc.Driver");

        //获取连接 这里MySQL用的是5.5版本
        //MySQL8.0版本之后url语句为:jdbc:mysql://localhost:3306/数据库名称?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true

        String url = "jdbc:mysql://localhost:3306/db1";

        //写入数据库账号密码
        conn = DriverManager.getConnection(url, "root", "root");

        //开启事务
        conn.setAutoCommit(false);

        // 编写sql
        // String sql = "update emp set salary = 3000";
        String sql = "update account set money = money - 500 where id = 1";
        String sql1 = "update account set money = money + 500 where id = 2";

        // 获取执行sql对象
        statement = conn.createStatement();

        // 执行sql
        int i = statement.executeUpdate(sql);
        System.out.println(100 / 0);
        int i1 = statement.executeUpdate(sql1);

        // 返回受影响行数
        System.out.println(i);
        System.out.println(i1);

        //提交事务
        conn.commit();


    } catch (SQLException e) {
        try {
            //事物回滚
            conn.rollback();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        System.out.println("转账失败");
        e.printStackTrace();
    } finally {
        try {
            // 释放资源
            statement.close();
            conn.close();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
}

 运行前sql数据库数据:

运行后sql数据库数据:

这里可以看见数据库并未发生变化说明事物回滚成功。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值