隔离级别、锁、脏读、不可重复读与幻读问题
一、三种并发问题对比
问题类型
定义
发生场景
示例
解决隔离级别
脏读
读取到其他事务未提交的数据
READ UNCOMMITTED
事务B读取事务A未提交的修改,事务A回滚
READ COMMITTED
不可重复读
同一事务内多次读取同一数据结果不同
READ COMMITTED
事务A读取数据后,事务B修改并提交,事务A再次读取结果不同
REPEATABLE READ
幻读
同一事务内多次查询同一范围返回不同行数
REPEATABLE READ
事务A查询范围数据后,事务B插入新数据并提交,事务A再次查询发现”幻影行”
SERIALIZABLE
二、详细说明与示例1. 脏读 (Dirty Read)定义:一个事务读取了另一个未提交事务修改过的数据。
发生条件:
隔离级别为READ UNCOMMITTED
一个事务修改数据但未提交
另一个事务读取了这个未提交的数据
示例:
123456789101112-- 事务ASTART TRANSACTION;UPDATE accounts SET balance = balance - 100 WHERE id = ...
计算机网络
[[拥塞窗口(cwnd)与慢启动阈值(ssthresh)]][[网络号]][[pcap-实战(一)]][[pcap-实战(二)]][[pcap-实战(三)]]
事务和隔离级别
[[隔离级别、锁、脏读、不可重复读与幻读问题]]
ACID
Atomicity(原子性):事务中的所有操作要么全部完成,要么全部不完成
Consistency(一致性):事务将数据库从一个有效状态转移到另一个有效状态
Isolation(隔离性):并发事务互不干扰
Durability(持久性):一旦事务提交,结果永久保存
多条SQL语句需要显式使用事务控制语句(如BEGIN, COMMIT, ROLLBACK)来保证ACID属性,单条SQL不一定能ACID单条SQL:原子性(Atomicity)
通常满足:单条SQL语句在大多数RDBMS中默认作为隐式事务执行
例外情况:
批量操作(如INSERT INTO … SELECT)可能部分成功
某些数据库的特定语句(如MySQL的ALTER TABLE可能不支持原子DDL)隔离性(Isolation)
受隔离级别影响持久性(Durability)
可能不满足的情况:
使用内存表(如MySQL的MEMORY引擎)
MySQL 事务详解事务是数据库管理系统中的一个核心概念,它代表一组必须全部成功或全部失败的数据库操作。MySQL ...
条件概率查找表
你说的方法在理论上是完全正确的:如果我们能拥有一个完全准确的、覆盖所有可能输入的 P(Y|X) 联合/条件概率查找表,那么根据贝叶斯最优分类器理论,按照这个查找表进行分类确实能实现最低的可能错误率(即贝叶斯错误率)。
然而,在现实世界的机器学习实践中,这种方法几乎总是完全不可行的。其核心问题在于,我们无法获得这个“完美的查找表”,而试图通过有限的数据去构建一个近似的查找表会带来一系列致命的问题。
以下是这种方法的几个主要问题,按重要性排序:
1. 维度灾难 - 最核心的问题(可解决)这是该方法失败的根本原因。
组合爆炸:假设特征向量 X 有 d 个维度(特征),每个特征有 k 个可能的值(即使是连续值,我们也要将其离散化为有限个bins)。那么所有可能的 X 组合数量是 k^d。这个数字会随着维度 d 的增加而呈指数级增长。*例子**:一个非常简单的图像分类(如手写数字识别),图像大小仅为 28x28 像素,每个像素有 256 种灰度值。那么可能的输入 X 的数量是 256^(28*28) = 256^784。这个数字远远超过了可观测宇宙中的原子总数。创建这样一个查找表在物理 ...
ID 特征的处理
这是一个非常经典且重要的问题。
直接回答:将 ID 本身作为一个特征直接输入给分类模型是无效的,而且几乎总是极其有害的。 它会导致严重的过拟合,使得模型完全丧失泛化能力。
但是,这并不意味着 ID 数据毫无价值。如果使用得当,它可以成为挖掘有效信息的金矿。
下面我们分两部分详细解释:
第一部分:为什么直接使用 ID 作为特征无效且有害?核心原因在于 ID 的 “高基数”和 “唯一性”。
1.完美的过拟合(Perfect Overfitting):*假设你的数据集中有10,000个样本,每个样本都有一个唯一的 User_ID。如果模型直接使用 User_ID 作为特征,它可以轻而易举地记住每个ID对应的标签。*对于树模型(如决策树、随机森林、XGBoost),它可以为每一个 User_ID 创建一个单独的分支,使得每个训练样本都能被完美分到一个唯一的叶子节点。模型在训练集上的准确率可以达到100%,但它只是记住了答案,并没有学会任何泛化的规律(比如“年龄大的人更可能购买A产品”)。*当遇到任何新用户(即训练集未见过的ID)时,模型会完全无法处理,预测结果会变得随机或基于极不可靠的默认路 ...
单调栈
单调栈 (Monotonic Stack)是一种维护「元素值在原数组中的索引」的栈结构,其对应的元素值满足单调递增或递减.它通常用于解决寻找下一个更大/更小元素或寻找最近更大/更小元素等问题。
[!NOTE] insight当来了一个元素,判断栈是否为空,如果为空,则直接将索引放进去;否则将栈中索引对应数组值破坏单调性的索引,都弹出,再将当前元素索引放入;那些弹出元素都等到了比他们大/小的元素,这个元素就是刚刚迫使它们弹出的那个元素!
注意是索引!!!其中栈内元素保持单调递增或单调递减的索引!!
保存索引,既能在O(1)恢复值,又能保存索引;如果保存值,无法保存索引
1. 核心特征栈内所有元素,都在等待那个比它大/小的元素(即单调栈的用途:寻找下一个更大/更小元素)
维护一组对应原数组上值单调的元素(通常保存这些元素的索引)
单调性:
递增栈:从栈底到栈顶递增
递减栈:从栈底到栈顶递减
维护方式:
入栈前,将破坏单调性的栈顶元素都弹出
新元素入栈
2. 常见应用场景2.1 下一个更大元素123456789101112 ...
单个用户QPS请求限制的伪代码
QPS < 60
单机版滑动窗口法思路:为每个用户维护一个请求时间戳队列,每次请求时,从该用户的请求时间戳队列移出时间窗口以外的请求时间戳,然后统计队列剩余个数,如果小于qps,则允许请求并且添加时间戳到队列
123456789101112131415161718192021222324from time import timeclass UserRateLimiter: def __init__(self, user_id, max_qps=60, window_size=1): self.user_id = user_id self.max_qps = max_qps # 每秒最大请求数 self.window_size = window_size # 时间窗口(秒) self.request_timestamps = [] # 用户请求时间戳队列 def allow_request(self): # 返回是否允许请求 current_time = ti ...
基数排序
11.10 基数排序 - Hello 算法
从低到高位依次排序数据量较大但数据范围m较小,m >10^7虽然高位决定了大小,但是不应该先排,因为每次都是对所有数的进行计数排序,计数排序是稳定的(保证顺序),因为低位的相对顺序不会被破坏
如果用高位如果每次对所有数进行排序,则最后会按照低位小排列,导致错误;如果对上一次的结果分批排序,需要大量的空间或者递归,空间复杂度溢出
使用范围:数据必须可以表示为固定位数的格式,且位数不能过大,尤其是整数。浮点数不适合使用基数排序,因为其位数过大,可能导致时间复杂度超出优点:稳定排序,空间复杂度低缺点:非原地排序,非自适应排序,
感受野计算
要计算感受野大小,需要从最后一层往前逐层计算。设最后的感受野大小为 RF,采用公式:RF = RF_prev + (kernel_size - 1) * stride_acc
从后往前分析:
最后一层3×3卷积(stride=1):
kernel_size = 3
此层的stride = 1起始RF = 3
池化层(2×2, stride=2):
kernel_size = 2
累积stride = 1RF = 3 + (2-1) × 1 = 4
第一个3×3卷积层(stride=2):
kernel_size = 3
累积stride = 2RF = 4 + (3-1) × 2 = 8
BN层和ReLU层不影响感受野
所以最终感受野大小 = 8 + (3-1) × 2 = 13
因此D选项13是正确答案。
交叉验证
交叉验证可以分为简单交叉验证、K折和留一法。
不分验证集是因为数据不足
简单交叉验证训练集和测试集
K折交叉验证(K-Fold Cross Validation)K折交叉验证是一种常用的模型评估方法,用于评估机器学习模型的性能,特别是在数据集较小的情况下。
基本概念
工作原理:
将原始数据集随机分成k个大小相似的子集(称为”折”)
每次使用其中k-1个子集作为训练集,剩下的1个子集作为验证集
重复这个过程k次,每次使用不同的子集作为验证集
最后将k次评估结果的平均值作为模型的最终性能指标
常见k值:
通常k取5或10
当数据集特别小时,可能会使用更大的k值(如LOOCV,即留一法交叉验证)
优点
充分利用有限的数据进行模型训练和评估
减少因数据划分不同而导致的评估结果波动
可以检测模型是否过拟合
适用于数据集较小的情况
留一法(K折交叉验证,k=1,留一个样本检验)