0
点赞
收藏
分享

微信扫一扫

JDBC操作事务

ivy吖 2022-04-16 阅读 85
javasql

1. 事务

(1) 概念

(2)事务的四大特性(ACID)

2. JDBC操作事务

package com.jing.jdbc;

import com.jing.utils.JDBCUtils;

import java.sql.*;

public class TestTransaction01 {

    public static void main(String[] args){
        Connection connection = null;
        PreparedStatement statement = null;
        ResultSet resultSet = null;


        try {
            connection = JDBCUtils.getConnection();

            /*
                由事务的原子性可知:一个事务中的SQL语句,要么都成功,要么都失败
                在提交之前出现异常,那么已经成功执行的SQL语句都会被自动回滚,效果就是都执行失败,即都未执行
             */

            // 关闭事务自动提交,默认会开启事务
            connection.setAutoCommit(false);

            String sql10 = "SELECT * FROM account where NAME = 'lucy'";
            statement = connection.prepareStatement(sql10);
            resultSet = statement.executeQuery();
            if(resultSet.next()){
                System.out.println("转账之前:money=" + resultSet.getObject("money"));
            }


            String sql1 = "UPDATE account set money = money - 500 where NAME = 'lucy'";
            statement =  connection.prepareStatement(sql1);
            statement.executeUpdate();

            String sql11 = "SELECT * FROM account where NAME = 'lucy'";
            statement = connection.prepareStatement(sql11);
            resultSet = statement.executeQuery();
            if(resultSet.next()){
                System.out.println("转账之后:money=" + resultSet.getObject("money"));
            }



            String sql2 = "UPDATE account set1 money = money + 500 where NAME = 'Tom'";
            statement =  connection.prepareStatement(sql2);
            statement.executeUpdate();

            //提交事务,提交之前对数据库的操作都不会生效
            connection.commit();


        } catch (SQLException e) {
            // 捕捉到异常
            System.out.println("捕捉到异常:" + e);

            try {
                // 回滚只能用在手动提交模式中
                // 作用:提交之前发现异常,可以执行rollback()方法回滚已经执行的SQL语句
                // 由于未提交,异常之前的执行的语句会被自动回滚,所以可以不写connection.rollback();
                // 自动回滚一般发生在释放资源之前,为了保持数据的一致性,所以建议手动释放资源,并在此之前检测到异常时显式地回滚事务
                connection.rollback();
                System.out.println("已回滚");
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
            try {
                String sql3 = "SELECT * FROM account where NAME = 'lucy'";
                statement = connection.prepareStatement(sql3);
                resultSet = statement.executeQuery();
                if(resultSet.next()){
                    System.out.println("发生异常回滚之后:money=" + resultSet.getObject("money"));
                }
            } catch (SQLException e1) {
                e1.printStackTrace();
            }

        } finally {
            JDBCUtils.release(connection,statement,null);
        }
    }
}

 

举报

相关推荐

0 条评论