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.总结

  1. 涉及到两个写的操作,我们一般通过手动事务去控制
  2. JDBC操作事务API
connection.setAutoCommit(fasle);  //开启事务
connection.commit();              //提交事务
connection.rollback();            //回滚事务
posted @ 2022-04-24 14:52  雩娄的木子  阅读(60)  评论(0编辑  收藏  举报