我反悔了!)MySQL事务处理

本文深入解析MySQL事务处理,涵盖事务的基本概念、引擎选择、自动提交控制、事务关键字如rollback、commit、savepoint的使用,以及通过实例演示如何在Java中实现事务控制。

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

MySQL事务处理

事务处理是来维护数据的完整性的。可以使批量的数据要么都执行,要么不执行(有错误的话)。

比如说我们去银行汇款,要是汇款的操作成功了,对方取钱的操作失败了,那不是被白嫖?所以我们设置操作可以撤回。这就叫事务处理

首先了解一个概念:引擎
并非所有的引擎都支持事务处理 查看你的引擎

show table status from 库名;

InnoDB 一个可靠的事务处理引擎,不支持全文搜索 MyISAM 性能极高,支持全文搜索,不支持事务处理 MEMORY
功能等同于MyISAM,数据存在内存中,速度很快

建表时确定引擎
create table students(...)engine=InnoDB;

如果你建表的时候后面没有engine=引擎名 那就是默认引擎 我的是InnoDB,可能你的跟我不一样
————————————

然后我们来了解一下三个关键字

rollback(回退)用于撤销操作
commit(提交)用于将结果写入数据表
savepoint(保留点)回退到这个保留点,不用对整个事务回退

默认情况执行sql语句的时候都是自动提交的,就是说一执行就写入表中了 不能回退

一、我们可以通过设置自动提交使我们可以撤回

//查看自动提交开关
select @@autocommit;
//设置手动提交
set autocommit=0;
//如果是默认自动提交,每执行一条sql都会自动提交无法rollback


二、还有一种可以使我们撤回的方法就是开启事务,无需修改autocommit

start transaction
//或者begin 作用与  start transaction相同
//执行一些sql语句(修改数据之类的)
rollback//你不能回退create、drop、select操作

提交(写入)数据

start transaction
//执行一些sql语句(修改数据之类的)
commit;
//提交之后不能回退

使用保留点

savepoint delete1;
rollback to delete1;

当我们提交或者回退之后,事务会自动关闭,以后的更改就会隐含提交


如果你用JBDC处理事务

就要修改成手动提交

public class Transaction{
    public static void main(String[] args) {
        //初始化
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
        } catch (ClassNotFoundException e){
            e.printStackTrace();
        }
        String sql="insert into hero values(0,?,?,?)";
        try(    //连接数据库
                Connection cn= DriverManager.getConnection(
                        "jdbc:mysql://localhost:3306/fzk?serverTimezone=UTC",
                        "root", "810481");
                PreparedStatement p=cn.prepareStatement(sql);

        ){  cn.setAutoCommit(false); //将自动提交修改成手动
            p.setString(1,"奥巴马");
            p.setInt(2,96);
            p.setInt(3,49);
            //这个数字是指从 '?' 开始,setString插入的是第一个问号
            p.execute();
            cn.rollback();      //回滚,这条数据将不会插入
        }catch (SQLException e){
            e.getErrorCode();
        }
    }
}
<think>嗯,用户想了解网络流算法和反悔贪心的结合或对比,以及它们的综合应用和优化。首先,我需要明确这两个概念的基本原理,然后再找它们的联系和区别。 首先,网络流算法,尤其是最大流问题,我记得主要是关于如何在网络中寻找从源点到汇点的最大流量。常用的算法有Ford-Fulkerson方法,Dinic算法等。网络流中的“反悔”机制,比如残余网络的构建,允许算法撤销之前的流分配,调整流量,这看起来和反悔贪心的思想有些相似,都是允许回退之前的决策以优化整体结果。 反悔贪心,根据用户提供的引用,特别是引用[2]和[4],反悔贪心允许在后续步骤中撤销之前的决策,用更优的选择替代。比如在建筑抢修的例子里,当遇到无法及时修复的建筑时,检查已修复的并替换耗时更长的,这样就能优化整体修复数量。 接下来,我需要比较两者的异同。相同点可能在于它们都具备某种形式的反悔机制,允许调整之前的决策。不同点可能在于应用场景和具体实现方式。网络流的反悔是通过残余网络和反向边实现的,而反悔贪心通常使用优先队列等数据结构来维护可能替换的候选。 在综合应用方面,比如在资源分配问题中,可能先用贪心策略快速找到可行解,再通过反悔或网络流的方法优化。例如,动态资源调度问题,可能需要实时调整资源分配,这时候结合两种方法可能会更高效。 优化方面,反悔贪心可能减少计算量,因为它不需要像网络流那样处理整个图结构,而网络流在处理复杂依赖时更系统。需要举一些例子,比如任务调度中的反悔贪心应用,或者网络流中的反向边设计。 还要注意用户提到的引用内容,引用[2]中的反悔检查流程和引用[4]中的具体代码实现,这些可以作为例子来说明反悔贪心的工作方式。而网络流中的残余网络概念可能需要进一步解释,比如反向边如何允许流量调整。 可能还需要讨论两者的适用场景:网络流适合有明确网络结构和容量限制的问题,而反悔贪心适合需要动态调整且问题具有贪心选择性质的场合。结合使用时,可能在预处理阶段用贪心,再通过网络流的全局调整来优化,或者反之。 最后,用户可能需要具体的例子来理解两者的结合,比如在流量分配中先用贪心选择路径,再用残余网络调整,或者使用反悔贪心来处理网络流中的某些子问题。这时候需要举一个具体的案例,比如在最大流问题中如何用反悔贪心优化增广路径的选择,或者如何在任务调度中结合网络流模型和反悔机制。 总结下来,回答的结构应该是先对比两者的机制,再讨论结合应用的可能场景,举例说明,最后提到优化方向。同时要确保引用相关的文献,比如引用网络流的反悔机制和反悔贪心的实现方式。</think>### 网络流算法与反悔贪心的结合与对比 #### 一、核心概念对比 1. **网络流算法** - 网络流算法通过建模为有向图(含源点、汇点、边容量),解决流量分配的最优化问题。其核心是**反向边机制**,允许在后续步骤中“撤销”之前的流量分配,例如在Ford-Fulkerson方法中,每次增广路径后会更新残余网络,反向边的容量表示可反悔的流量[^1]。 - 典型应用:最大流、最小割、费用流问题。 2. **反悔贪心算法** - 反悔贪心在贪心策略基础上引入**动态调整能力**,通过优先队列(堆)等数据结构维护历史决策,当新决策更优时替换旧选择。例如在股票买卖问题中,若当前股价高于已买入的最低价,则卖出并记录差价,同时将当前价格重新加入队列以允许后续反悔[^3][^4]。 #### 二、结合与综合应用 1. **动态资源分配问题** - **场景**:需要实时调整资源分配,例如任务调度、带宽分配。 - **结合思路**:先用贪心策略快速分配初始资源,再通过网络流模型优化全局约束。例如,在任务截止时间限制下,用反悔贪心优先处理耗时短的任务,若超时则替换为更高优先级任务,同时用网络流验证全局可行性。 2. **网络流中的贪心优化** - **增广路径选择**:在Dinic算法中,使用贪心策略优先选择最短增广路径,同时通过反向边实现“反悔”。这与反悔贪心的局部优化思想相似。 - **代码片段示例(伪代码)**: ```python while 存在增广路径: 选择当前最短路径(贪心策略) 更新流量和残余网络(允许反向边反悔) ``` 3. **费用流与反悔机制** - 在最小费用流问题中,若某条路径的费用过高,可通过反向边撤回流量并选择更优路径,类似反悔贪心中的替换操作[^2]。 #### 三、优化方向 1. **时间复杂度优化** - 反悔贪心通常时间复杂度更低(如$O(n \log n)$),适合实时性要求高的场景;网络流算法(如Dinic算法$O(n^2 m)$)更适合需要全局最优解的问题。 2. **空间复杂度对比** - 反悔贪心仅需维护候选集合(如堆),空间复杂度为$O(n)$;网络流需存储整个图结构,空间复杂度为$O(m+n)$。 3. **问题适配性** - **反悔贪心**:适合问题具有“局部最优可修正”特性,例如区间调度、股票交易[^3]。 - **网络流**:适合有明确网络结构和复杂约束的问题,例如交通规划、电路布线。 #### 四、典型案例 1. **任务调度问题** - **问题描述**:在有限时间内完成最多任务,每个任务有耗时和截止时间。 - **反悔贪心解法**:按截止时间排序,用堆维护已选任务耗时,超时时替换耗时最长的任务[^4]。 - **网络流建模**:将任务视为节点,通过时间分层图建模,用最大流求解可完成任务数。 2. **股票买卖问题** - **反悔贪心实现**(引用自[^3]): ```cpp priority_queue<int, vector<int>, greater<int>> que; for (int x : prices) { que.push(x); if (x > que.top()) { ans += x - que.top(); que.pop(); // 反悔之前的最低买入价 que.push(x); // 允许后续反悔当前操作 } } ``` #### 五、总结 | 维度 | 网络流算法 | 反悔贪心 | |--------------|-------------------------------------|-----------------------------------| | **反悔机制** | 通过反向边和残余网络实现 | 通过堆/优先队列替换历史决策 | | **适用场景** | 全局约束复杂的问题(如最大流) | 局部可修正的贪心问题(如调度) | | **时间复杂度**| 较高($O(n^2 m)$) | 较低($O(n \log n)$) | | **空间复杂度**| 较高(存储图结构) | 较低(维护堆) |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值