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