MySQL学习之JDBC操作事务

本文回顾了ACID事务原则,并通过Java JDBC模拟转账事务,展示了事务的原子性、一致性、隔离性和持久性。通过实例演示事务成功与失败情况,理解并发控制的挑战和隔离级别问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学自 狂神说

事务

回顾:ACID原则

原子性:要么全部完成,要么都不完成

一致性:总数不变

隔离性:多个进程互不干扰

持久性:一旦提交不可逆,持久化到数据库

隔离性问题:

脏读:一个事务读取了另一个没有提交的事务

不可重复读:在同一个事务内,重复读取表中的数据,表数据发生了改变

虚读(幻读):在同一个事务内,读取到了别人插入的数据,导致前后读出来结果不一致

模拟转账事务

已知表格
在这里插入图片描述

测试事务成功

package com.database.lesson04;

import com.database.lesson02.utils.JdbcUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class TestTransaction {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement pst = null;
        ResultSet rs = null;

        try {
            //创建连接
            conn = JdbcUtils.getConnection();
            //关闭数据库的自动提交功能 == 自动会开启事务
            conn.setAutoCommit(false);

            String sql1 = "update account set money=money-100 where name='A'";
            pst = conn.prepareStatement(sql1);
            int i = pst.executeUpdate();
            if(i > 0){
                System.out.println("发起转账!");
            }

            String sql2 = "update account set money=money+100 where name='B'";
            pst = conn.prepareStatement(sql2);
            int j = pst.executeUpdate();
            if(j > 0){
                System.out.println("接受转账!");
            }

            //业务完毕,提交事务
            conn.commit();
            System.out.println("转账成功!");


        } catch (SQLException throwables) {
            try {
                //如果转账失败,那么让事务回滚
                conn.rollback();//捕获一下异常
            } catch (SQLException e) {
                e.printStackTrace();
            }
            throwables.printStackTrace();
        }finally {
            JdbcUtils.release(conn,pst,null);
        }
    }
}

在这里插入图片描述
在这里插入图片描述

模拟事务失败

在“发起转账”后使代码停止运行,未进行“接受转账”
在这里插入图片描述
在这里插入图片描述
结果为发生变化,说明事务回滚了(默认自动回滚了,没有执行到回滚代码
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值