前言
提到MySQL的事务,我相信对MySQL有了解的同学都能聊上几句,无论是面试求职,还是日常开发,MySQL的事务都跟我们息息相关。
而事务的ACID(即原子性Atomicity、一致性Consistency、隔离性Isolation、持久性Durability)可以说涵盖了事务的全部知识点,所以,我们不仅要知道ACID是什么,还要了解ACID背后的实现,只有这样,无论在日常开发还是面试求职,都能无往而不利。
为了大家更好的阅读体验,对ACID的深入分析将分为上下两篇。
本篇主要围绕ACID中的I,也就是“隔离性”展开,从基本概念,到隔离性的实现,最后以一个实战案例进行融会贯通。
-
将单词中每个字母的ASCll码值“进位”相加
-
再跟哈希表的size求余、取模,作为散列值
比如,英文单词java,我们转化出来的散列值就是下面这样:
hash(“java”)=((“j” - “a”) * 262626 + (“a” - “a”)2626 + (“v” - “a”)*26+ (“a”-“a”)) / 78978
还有很多设计方法,比如直接寻址法、平方取中法、折叠法、随机数法等。hash函数设计的好坏,决定了哈希表冲突的概率大小,也直接决定了哈希表的性能。
无论设计的多么优秀,还是得考虑如何解决散列冲突问题。
[](()3 散列冲突
=====================================================================
[](()3.1 开放寻址法
若出现hash冲突,就重新探测一个空闲位置,将其插入。
最简单的就是
[](()3.1.1 线性探测(Linear Probing)
当我们往散列表中插入数据时,如果某个数据经过散列函数散列之后,存储位置已经被占用了,我们就从当前位置开始,依次往后查找,看是否有空闲位置,直到找到为止。如ThreadLocalMap。
[](()案例
- 黄块
空闲位置
- 橙块
已存储数据