JDBC事务开启、事务提交、事务回滚 -- 转账演示
JDBC事务开启、事务提交、事务回滚--转账演示
1、转账前:
2、代码:
package com.happy.lesson1;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ResourceBundle;
//转账演示
public class JDBCTest11 {
public static void main(String[] args) {
ResourceBundle bundle = ResourceBundle.getBundle("JDBC");
String driver = bundle.getString("driver");
String url = bundle.getString("url");
String user = bundle.getString("user");
String password = bundle.getString("password");
Connection conn = null;
PreparedStatement ps = null;
int count = 0;
try {
//1.注册驱动
Class.forName(driver);
//2.获取连接
conn = DriverManager.getConnection(url,user,password);
//关闭自动提交(开启事务)
conn.setAutoCommit(false);
//3.获取数据库操作对象
String sql = "update t_act set balance = ? where actno = ?";//处理sql语句
ps = conn.prepareStatement(sql);
//传值
//111转账10000元给222
ps.setDouble(1,10000);
ps.setInt(2,111);
//4.1执行sql
count = ps.executeUpdate();
//发生异常
int e = 1/0;
//222收到转账10000元
ps.setDouble(1,10000);
ps.setInt(2,222);
//4.2执行sql
count += ps.executeUpdate();
//提交事务
conn.commit();
} catch (Exception e) {
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
} finally {
//5.处理结果集
System.out.println((count==2)?"转账成功":"转账失败");
//6.关闭资源
try {
if (ps != null){
ps.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
3、运行代码,转账发生异常时
111的金额还是20000元,222金额还是0元,金额没有因为异常而丢失,说明事务事件起了作用。
4、修复异常,再运行代码
idea软件没有报错,数据库数据也显示正常,说明代码正常,转账成功!
5、改动了哪些地方
5.1 用try{}catch{}finally{}捕捉异常代替直接抛出异常
因为发现发生异常后,后面的代码都无法执行了,例如发生异常后,后面的事务回滚也执行不到了
5.2 事务的3条重要代码
//关闭自动提交(开启事务)
conn.setAutoCommit(false);
//提交事务
conn.commit();
//事务回滚
conn.rollback();
5.3 把处理结果集放到了finally{}中
因为我想在控制台看是否转账成功,无论是否发生异常。
5.4 提升作用域
Connection conn = null;
PreparedStatement ps = null;
int count = 0;
就是放在try的外面,让finally也能访问到
5.5 简单的异常
//发生异常
int e = 1/0;
5.6 结果累加
count += ps.executeUpdate();
明确只影响2条数据库数据,以便更好的处理结果集