文章目录
- 准备数据
- JDBC操作事务
- API介绍
- 案例代码
- 小结
准备数据
# 创建一个表:账户表.
create database day05_db;
# 使用数据库
use day05_db;
# 创建账号表
create table account(
id int primary key auto_increment,
name varchar(20),
money double
);
# 初始化数据
insert into account values (null,'a',1000);
insert into account values (null,'b',1000);
JDBC操作事务
API介绍
Connection
接口中与事务有关的方法
-
void setAutoCommit(boolean autoCommit) throws SQLException; false:开启事务, true:关闭事务
-
void commit() throws SQLException; 提交事务
-
void rollback() throws SQLException; 回滚事务
说明:
注意:在jdbc事务操作中,事务的控制都是通过 Connection
对象完成的,当一个完整的业务操作前,我们首先使用conn.setAutoCommit(false)
来开启事务。默认情况下是true的,表示关闭事务,那么一条sql语句就是一个事务,默认提交事务。如果设置为false,那么表示开启事务,所有的sql语句就会都在一个事务中。
当业务操作完成之后,如果整个操作没有问题,我们需要使用conn.commit()来提交事务
。当然了,如果出现了异常,我们需要使用conn.rollback()撤销所有的操作,所以出现异常,需要进行事务的回滚
。
案例代码
如下是使用jdbc操作事务的转账案例代码。
需求:a转给b 100元。
分析:
a用户 money=money-100
b用户 money=money+100
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class JDBCTest08 {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement pst1 = null;
PreparedStatement pst2 = null;
//生成try-catch-finally代码块快捷键:ctrl+alt+T,不要选中释放资源的代码
try {
/*
需求:使用jdbc控制mysql事务。
使用Connection接口中的方法:
1.开启手动控制事务:void setAutoCommit(false)
2.一切正常,提交事务:void commit()
3.出现异常,回滚事务: void rollback()
*/
//使用事务完成a给b转账100元
//a-100
//b+100
//1.注册驱动
// DriverManager.registerDriver(new Driver());
//2.获取数据库连接
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day03_heima139", "root", "1234");
//开启手动控制事务 == 1.开启手动控制事务:void setAutoCommit(false)
conn.setAutoCommit(false);
//3.获取发送sql语句的预编译对象
// a-100
pst1 = conn.prepareStatement("update account set money=money-100 where name=?");
// b+100
pst2 = conn.prepareStatement("update account set money=money+100 where name=?");
//4.发送sql语句
//给占位符赋值
pst1.setString(1, "a");
pst2.setString(1, "b");
//5.发送sql语句
pst1.executeUpdate();
//模拟异常
// int i = 1 / 0;
pst2.executeUpdate();
//2.一切正常,提交事务:void commit()
conn.commit();
} catch (Exception throwables) {
throwables.printStackTrace();
try {
//3.出现异常,回滚事务: void rollback()
if (conn != null) {
conn.rollback();
}
} catch (SQLException e) {
e.printStackTrace();
}
} finally {
//5.处理结果
//6.释放资源
try {
if (pst2 != null) {//防止空指针异常
pst2.close();
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
try {
if (pst1 != null) {//防止空指针异常
pst1.close();
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
try {
if (conn != null) {//防止空指针异常
conn.close();
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
小结
JDBC中与事务相关的API?Connection
接口中setAutoCommit,commit,rollback
JDBC操作事务的步骤?
- 注册驱动
- 获取连接
- 获取到Statement
- 开启事务
- 使用Statement执行SQL
- 提交或回滚事务
- 关闭资源