回滚事务:conn.rollback()问题

今天在书上学习JDBC事务处理:
1.setAutoCommit(boolean autocommit):设置是否自动提交事务。
2.commit();提交事务。
3.rollback();回滚。
运行代码时出现了conn.rollback()指针为空的问题。

部分原代码如下:
回滚事务:conn.rollback()问题_第1张图片
image.png

出现了指针为空的情况说明conn==null;
然后我去查了数据库连接代码,果然写错了,
Class.forName("com.mysql.jc.jdbc.Driver");

把jc改成cj再运行就成功支付了。
所以书上的代码有bug,在conn.rollback()之前还需要判断conn是否为空,于是我把代码改成如下所示:

   if(conn!=null) {
       try{
           conn.rollback();
           System.out.println("支付失败,回滚完成");
       }catch(SQLException e1) {
           e1.printStackTrace();
       }
   }}
   
   if(conn==null) {
       try {System.out.println("支付失败");}
   

总代码如下:

package com.qfedu.chapter02;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class TestPayment {
    public static void main(String[] args) {
    Connection conn=null;
    PreparedStatement pstat1=null;
    PreparedStatement pstat2=null;
    try {
        Class.forName("com.mysql.cj.jdbc.Driver");
        conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/chapter02?serverTimezone=GMT", "root", "123456");
    //关闭事物的自动提交
        conn.setAutoCommit(false);
    //lilei的账户减去100元
        pstat1=conn.prepareStatement("UPDATE account SET money = money-100 WHERE aname=?");
        pstat1.setString(1,"lilei");
        pstat1.executeUpdate();
    //shop的账户增加100元
        pstat2=conn.prepareStatement("UPDATE account SET money = money+100 WHERE aname=?");
        pstat2.setString(1, "shop");
        pstat2.executeUpdate();
    //提交事务
        conn.commit();
        System.out.println("支付完成");
    }catch(Exception e) {
        //如有异常,回滚事务
        if(conn!=null) {
        try{
            conn.rollback();
            System.out.println("支付失败,回滚完成");
        }catch(SQLException e1) {
            e1.printStackTrace();
        }
    }}
    
    if(conn==null) {
        try {System.out.println("支付失败");}
    
    finally {
        //释放资源
        if(pstat1!=null) {
            try {
                pstat1.close();
            } catch(SQLException e) {
                e.printStackTrace();
            }
            pstat1=null;
        }
        if(pstat2!=null) {
            try {
                pstat2.close();
            } catch(SQLException e) {
                e.printStackTrace();
            }
            pstat2=null;
        }
        if(conn!=null) {
            try {
                conn.close();
            }catch(SQLException e) {
                e.printStackTrace();
            }
        }
    }

    }

    }}

你可能感兴趣的:(回滚事务:conn.rollback()问题)