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);
        }
    }
}
 
