MySQL之JDDBC事务操作
JDBC事务的处理
之前我们是使用MySQL的命令来操作事务。接下来我们使用JDBC来操作事务. 先来学习下相关的API
1、API
Connection中与事务有关的方法 | 说明 |
---|---|
setAutoCommit(boolean autoCommit) | 参数是true或false 如果设置为false,表示关闭自动提交,相当于开启事务; 类似sql里面的 start transaction; |
void commit() | 提交事务; 类似sql里面的 commit; |
void rollback() | 回滚事务; 类似sql里面的 rollback; |
2、JDBC操作流程
try{
connection.setAutoCommit(false); //开启事务
...操作数据库
connection.commit(); //提交事务
}catch(Exection e){
connection.rollback(); //回滚事务
}finally{
...释放资源
}
3、案例-转账案例
- 案例的准备工作
create table account(
id int primary key auto_increment,
name varchar(20),
money double
);
insert into account values (null,'zs',1000);
insert into account values (null,'ls',1000);
insert into account values (null,'ww',1000);
1.需求
zs给ls转100, 使用事务进行控制
2.分析
1、获取得到连接;
2、开始事务;JDBC中是设置autocommit来进行操作的;
3、执行转换操作;
4、转账操作执行成功进行提交事务;转账操作失败则回滚事务;
3.实现
- 代码实现
package com.guang.jdbc;
import com.guang.utils.JdbcUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
/**
* @Description:
* @Author: lg
*/
public class TransferClient {
public static void main(String[] args) throws Exception {
Connection connection = null;
PreparedStatement preparedStatement01 = null;
PreparedStatement preparedStatement02 = null;
try {
//1.获得连接
connection = JdbcUtils.getConnection();
//*******开启事务*********
connection.setAutoCommit(false);
//2.创建预编译sql语句对象(2个)
String sql01 = "update account set money = money-? where name = ?";
preparedStatement01 = connection.prepareStatement(sql01);
String sql02 = "update account set money = money+? where name = ?";
preparedStatement02 = connection.prepareStatement(sql02);
//3.设置参数, 执行(zs-100,ls+100)
preparedStatement01.setDouble(1,100);
preparedStatement01.setString(2,"zs");
preparedStatement01.executeUpdate();
int i = 1/0; //模拟出问题
preparedStatement02.setDouble(1,100);
preparedStatement02.setString(2,"ls");
preparedStatement02.executeUpdate();
//*******提交事务*********
connection.commit();
} catch (Exception e) {
e.printStackTrace();
//*******回滚事务*********
connection.rollback();
} finally {
//4.释放资源
preparedStatement02.close();
JdbcUtils.closeAll(null,preparedStatement01,connection);
}
}
}
4.总结
- 涉及到两个写的操作,我们一般通过手动事务去控制
- JDBC操作事务API
connection.setAutoCommit(fasle); //开启事务
connection.commit(); //提交事务
connection.rollback(); //回滚事务
从理论中来,到实践中去,最终回归理论