隔离性的原理: 1.0 隔离性是通过锁机制实现的。当一个事务修改数据时,需要先获取锁。其它事务要修改数据,必须等待之前的事务提交或者回滚,然后释放锁操作之后。 myisam只支持表锁,innodb支持表锁和行锁。因为表锁比较影响性能,所以通常情况下,使用行锁就可以了。 2.0 隔离性的另外一个方面,就是一个事务修改数据,影响另外一个事务读取数据。这是通过mvvc模型实现的。 mvvc模型,就是每行数据有个隐藏的数据列,其中包含事务id和指向undolog的指针,从而形成数据版本链条。readview则指定了读取哪个数据版本。

事务必须遵循ACID这4个特性。分别代表原子性、一致性、隔离性、持久性。 原子性就代表,事务的执行和回退是一个整体,事务中包含的sql要么全部执行,要么全部回退。 一致性就是,事务执行前后,数据库都是处于一致性状态中。 隔离性就是,事务在提交之前,对于其它事务都是不可见的。直到提交时。 持久性就是,事务一旦发生提交,其提交结果就不会发生改变。即使发生数据库宕机,也不会改变。

mysql存在两种储存引擎,分别是innodb和myisam。引擎的不同,导致了实现索引的方式的不同。 myisam的索引结构也是采用b+树结构,叶子节点储存的是数据记录地址。其主索引和辅助索引的结构基本一致,区别就是主索引的key不能重复。数据搜索过程是,按照b+树的搜索算法,如果找到key,就找到data域中的地址,然后读取数据记录。 innodb的索引结构也是采用b+树结构,叶子节点储存的是数据记录,或者说数据文件本身就是主索引文件。数据搜索流程是,先通过辅助索引找到主键,然后根据主键查询主索引,找到data域中的数据记录。 所以innodb必然包含一个主索引。 innodb的数据搜索流...

  Lfse1rsbuUXY   2023年12月22日   54   0   0 搜索主键数据数据主键搜索

b+树的一大优点就是高扇出性质,在数据库中,b+树的高度一般就是2到4,所以只需要2到4次io操作就可以查询到索引。 因为现在一般的磁盘每秒至少可以做100次IO操作,2~4次的IO操作意味着查询时间只需0.02~0.04秒。 在b+树中,所有数据记录节点都是按键值的大小顺序存放在同一层的叶子节点,各叶子节点通过指针进行链接。

在数据有序性方面。b+树索引,因为底层是有序排列的,所以支持范围查询、数据排序。hash索引,因为底层不是有序的,所有不支持范围查询、数据排序。 在查询可预测方面。由于hash函数不可预测,hash不支持模糊查询及多列索引的最左匹配原则。 在效率稳定性方面。b+树比较稳定。hash由于可能出现,大量相同key的hash冲突现象,导致效率降低很大。同时hash的等值查询会很快。所以hash的稳定性不佳。 所以一般情况下,使用b+树即可,可以达到稳定较快的效果。

索引是储存在磁盘上的数据结构。所有的列类型都可以加索引,索引的最主要目的是为了增加查询速度。 常用的innodb储存引擎只支持btree索引。别的引擎例如heap会支持hash索引。 索引的好处主要有4点。第一是增加查询速度。第二是唯一索引可以确保数据唯一性。第三是加快分组和排序的速度。第四是加快连表查询的速度。 索引的坏处主要有3点。第一是索引会占用一些储存空间,甚至其空间会超过数据文件。第二是索引的建立和维护会有开销。第三是在数据增、删、改时,索引也会动态维护,减低了数据维护速度。

普通索引允许值重复,允许空值。唯一索引不允许值重复。对于特殊的唯一索引,主键索引是不允许空值的。 索引按照字段数量,分为单列索引和组合索引。 查询字段中满足最左匹配原则时,才会触发组合索引。 其它的一些类型包括全文索引,以及空间索引。

包含堆、方法区、程序计数器、本地方法栈、虚拟机栈。这就是运行数据区的几个部分。其中堆和方法区是线程共有的,其它数据区域是线程私有的。 堆中存储对象数据。 方法区中储存类信息、常量及静态变量等信息。 方法栈中的栈帧和线程的寿命是一致的,储存方法执行时的相关常量,比如局部变量、方法出口这些。本地方法栈是本地方法相关,例如c编写的内部方法。而虚拟机栈则是java方法相关。 程序计数器保存下一条需要执行的字节码命令。 OOM就是内存溢出,发生的数据区域,除了程序计数器,都可以发生。

jdk1.7时,hashmap的实现原理是数组+链表,而且元素采用头插法。 jdk1.8时,hashmap的实现原理转换为数组+链表/红黑树,当链表长度>8,且数组长度>64时,链表将转化为红黑树。而且元素的新增采用尾插法。之所以转为红黑树,是为了提高搜索效率。 jdk1.7时,并发hashmap的原理是分段锁,不同的线程会锁一部分数据也就是segment,这样就减少了不同线程之间的竞争。 jdk1.8时,并发hashmap的原理是通过cas和synchronized实现的,synchronized每次只锁定当前数组或红黑树的首节点。 hashmap的一些细节,初始容量是16。当元...

cms垃圾回收器的工作流程是,初始标记、并发标记、重新标记、并发清除。这4个流程中,初始标记和重新标记需要暂停工作线程。 cms垃圾回收器的缺点是,对于服务器cpu比较敏感。然后是不能清理浮动垃圾。再然后由于其基于标记-清理算法,所以会产生大量的空间碎片。 g1垃圾回收器在理念上抛弃了分代的概念,将内存空间分为大小相等的若干个区域。然后维护一个有限列表。根据系统配置的最大允许回收时间,优先回收垃圾最多的区域。 g1垃圾回收器由于基于标记-整理算法,所以不会产生空间碎片。另外一个优点就是可以精确控制停顿时间。 jdk1.7/1.8中,新生代用ps回收器,老年代用po回收器。1.9之后,采用g1回...

线程一般有6种状态,它们分别是新建、运行、阻塞、无限期等待、有限期等待、以及结束。 新建,就是线程刚刚被创建,但是还没有调用start方法。 运行,其实有两种状态,分别是就绪和运行中。 阻塞,表示线程阻塞与锁。 无限期等待,表示线程进入等待状态,需要其它线程做出通知或者动作,才能跳出该状态。 有限期等待,超时等待状态,表示这个线程可以定时跳出该状态。 结束,表示当前线程已经执行完毕。

使用setnx命令获取锁,然后使用expire命令,保证有个过期时间,让锁能够及时释放。 setnx的含义是,当要设置的key不存在时,那么这个字符串设置成功。否则,就会设置失败。它避免了重复执行命令,导致前值被覆盖的问题。

  Lfse1rsbuUXY   2023年11月13日   13   0   0 字符串字符串

在jdk1.7的时候是使用分段锁segment,每一把锁只锁容器其中一部分数据,多线程访问容器里不同数据段的数据,就不会存在锁竞争,提高并发访问率。 在jdk1.8的时候摒弃了Segment的概念,而是直接用Node数组+链表+红黑树的数据结构来实现,并发控制使用synchronized和CAS来操作。synchronized只锁定当前链表或红黑二叉树的首节点。

相同点: 首先,都是可重入锁。就是外部函数获取锁之后,内部函数仍然可以获取锁。 其次,都保证了可见性和互斥性。可见性就是同一变量的修改对不同线程可见。互斥性就是指资源只能由一个线程持有。 最后,都可以用于多线程情况下的编程。 不同点: 从锁的可中断性来说,ReentrantLock等待可中断。 从锁的公平性来说,两者都是非公平的。但是ReentrantLock配置成为公平的。 从绑定条件数量上说,ReentrantLock可以是多个条件。 从实现原理上说,synchronized是JVM级别的。ReentrantLock是一个Lock接口下的实现类。 从获取锁、释放锁的方式上说,synchro...

线程死锁造成这个有4个因素,分别是互斥使用、占有且等待、不可抢占、循环等待。当死锁产生时,这4个因素就一定会存在的。 互斥使用,就是指资源在同一时间只能给一个线程使用。 占有且等待,就是线程占有原资源的同时,申请新的资源并等待。 不可抢占,就是其它线程无法夺取资源的控制权。资源只能由占有者释放。 循环等待,多个线程,占有多个资源的同时,申请对方的资源。形成一个循环等待的链条。 那么怎么避免死锁呢,就是破坏上面的条件之一。比如第四个条件,给个资源有序分配方案,打破循环链条,那么死锁就解决了。

线程池具有几个主要的参数。 核心线程数,就是标识线程池子里维持的最小的线程数量,用于维持这个池子的基本功能。 最大线程数,当数量增多的时候,线程的数量也会同时增加,但是呢,线程数量增加会有一个上限,这个就是最大线程数。 空闲线程存活时间,当空闲线程大于这个时间,而且线程数量大于核心线程数时,空闲线程就会被销毁。 还有个参数,就是存活时间的时间单位。 阻塞队列,表示当最大线程数达到了,还有线程进来,那么它们就在阻塞队列里等待。 线程工厂。 拒绝策略。

关注 更多

空空如也 ~ ~

粉丝 更多

空空如也 ~ ~