Control de transacciones Java del aprendizaje de bases de datos

1. Asuntos

Una transacción de base de datos (transacción) es una secuencia de operaciones de base de datos que acceden y posiblemente manipulan varios elementos de datos, estas operaciones se ejecutan o no se ejecutan en absoluto, y son una unidad de trabajo indivisible. Una transacción consta de todas las operaciones de la base de datos realizadas entre el inicio de la transacción y el final de la transacción.
Por ejemplo, cuando vamos a un banco a transferir dinero, la operación se puede dividir en los siguientes dos pasos:
(1) Retirar dinero de la primera cuenta. String sql1;
(2) Deposite el dinero en la segunda cuenta. String sql2;
En este proceso, los dos enlaces están relacionados. ** Los fondos de la primera cuenta deben depositarse correctamente en la segunda cuenta, si no se completa el segundo enlace, se debe cancelar todo el proceso, de lo contrario se producirá el problema de la pérdida de fondos. ** Todo el proceso de transacción se puede considerar como una sola cosa. El éxito significa todo el éxito y el fracaso significa toda la cancelación. Esto puede evitar la inconsistencia de los datos cuando hay un problema en el medio de la operación.

2. Aplicaciones Java específicas

En un proyecto, se requieren las siguientes tres declaraciones para formar una transacción

String sql = "insert into Train_ticket (user_id,train_id,start_station_name,end_station_name,carriage,seat_grade,seat_location,ride_time,start_time,end_time,price) " +
                "values ('"+ticket.getUser_id()+"','"+ticket.getTrain_id()+"','"+ticket.getStart_station_name()+"','"+ticket.getEnd_station_name()+"',"+ticket.getCarriage()+","+ticket.getSeat_grade()+"," +
                "'"+ticket.getSeat_location()+"','"+ticket.getRide_time()+"','"+ticket.getStart_time()+"','"+ticket.getEnd_time()+"',"+ticket.getPrice()+");";

        String sql2 = "update Train_seat set occupy=0 where train_id='"+ticket.getTrain_id()+"' and carriage="+ticket.getCarriage()+" and seat_location='"+ticket.getSeat_location()+"'";
        String sql3 = "insert into Ride_train values ('"+ticket.getUser_id()+"','"+ticket.getTrain_id()+"',' "+ticket.getRide_time()+"   "+ticket.getStart_time()+"')";

Cómo garantizar su atomicidad:
use la confirmación y la reversión de transacciones

Encapsule las declaraciones SQL que componen la transacción en un método, o se comprometen de manera desigual o fallan de manera desigual

/***
 * 数据库的事务并发控制
 */
public class Affairs {
    
    

    static Connection conn=null;
    static {
    
    
        conn=DBConnection.getConnection();
    }

    public static int  transaction_control(String sql[]){
    
    

        Statement stmt = null;

        int result = 0;

        try {
    
    

            // 开启事务
            //不把其设置为true之前都是一个当作一个事务来处理
            conn.setAutoCommit(false);

            // 创造SQL语句

            // 执行SQL语句
            stmt = conn.createStatement();
            for (int i = 0; i < sql.length; i++) {
    
    
                stmt.executeUpdate(sql[i]);
            }

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

            System.out.println( "OK!" );
        }
        //发生任何错误均需回滚
        catch (SQLIntegrityConstraintViolationException e3) {
    
    

            result = -1;//主码冲突,返回支付失败
            try {
    
    
                // 回滚事务
                //撤销上面对事务的所有操作哈!
                conn.rollback();
            }  catch (SQLException e2){
    
    

            }

        } catch (Exception e) {
    
    
            e.printStackTrace();
            System.out.println("有错误!");

            try {
    
    
                // 回滚事务
                //撤销上面对事务的所有操作哈!
                conn.rollback();
            }  catch (SQLException e2){
    
    

            }
        }

        return result;

    }

}

Herramienta DBConnection

//com.mysql.cj.jdbc.Driver数据库驱动
    private static final String DBDRIVER="com.mysql.cj.jdbc.Driver";
    //IP地址202.194.14.120  端口号3306    数据库的名字TrainTicketSystem
    private static final String DBURL="jdbc:mysql://localhost:3306/TrainTicketSystem?&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true";
    //用户名root
    private static final String DBUSER="root";
    //密码***
    private static final String DBPASSWORD="***";
    static {
    
    
        try {
    
    
            Class.forName(DBDRIVER);
            System.out.println("加载驱动成功");
        } catch (ClassNotFoundException e) {
    
    
            e.printStackTrace();
            System.out.println("加载驱动失败");
        }
    }
    public static Connection getConnection() {
    
    
        Connection conn=null;
        try {
    
    
            conn=DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD);
            System.out.println("连接成功");
        } catch (SQLException e) {
    
    
            // TODO: handle exception
            e.printStackTrace();
            System.out.println("发生连接异常");
        }
        return conn;
    }

3. La clave

Antes de la ejecución, debe haber conn.setAutoCommit (falso); esta oración es para no establecer envío automático, si el envío automático es equivalente a una declaración SQL es una transacción.
Si conn.setAutoCommit (verdadero), entonces es para establecer envío automático, primero La oración se puede enviar y la base de datos tendrá los registros correspondientes, pero la segunda oración no se puede revertir si se informa de un error.
Resumen: antes de revertir la transacción, conn.setAutoCommit (falso); de esta manera, la siguiente declaración es equivalente a una transacción, una vez que ocurre un error, todas las operaciones se deshacen.

Supongo que te gusta

Origin blog.csdn.net/joey_ro/article/details/108761522
Recomendado
Clasificación