一,什么是事务
事务:是数据库操作的最小工作单元,是为单个逻辑工作单元执行的一系列操作 ,在一个业务流程当中,通常需要多条DML(insert delete update)语句共同联合才能完成,这多条DML语句必须同时成功,或者同时失败,这样才能保证数据的安全。多条DML要么同时成功,要么同时失败,这叫做事务。
事务的四个处理过程
(1)开启事务 (start transaction)
(2)执行核心业务代码
(3)提交事务(如果核心业务处理过程中没有出现异常)(commit transaction)
(4)回滚事务(如果核心业务处理过程中出现异常)(rollback transaction)
事务的四大特性:
(1)原子性:事务中所有操作是不可分割的原子单位,事务中所有操作要么全部执行成功,要么全部执行失败。
(2)一致性:事务执行后,数据库状态与其它业务规则保持一致。如转账无论事务执行是否成功参与转账的账户余额之和是不会改变的。
(3)隔离性:隔离性是指并发操作中,不同事务之间应该隔离开来,使每个并发中事务不会相互干扰。
(4)持久性:一旦事务提交成功,事务中所有的数据操作都必须被持久化到数据库中,即使提交事务后,数据库马上崩溃,在数据库重启时,也必须保证通过某种机制恢复数据。
二,事务的隔离级别
数据库中读取数据存在的三大问题
(1)**脏读:**假设有两个事务 T1/T2 同时在执行,T1 事务有可能会读取到 T2 事务未提交的
数据,但是未提交的事务 T2 可能会回滚,也就导致了 T1 事务读取到最终不一
定存在的数据产生脏读的现象
(2)**不可重复读:**假设有两个事务 T1/T2 同时执行,事务 T1 在不同的时刻读取同一行数据的时候结果可能不一样,从而导致不可重复读的问题。
(3)**幻读:**假设有两个事务 T1/T2 同时执行,事务 T1 执行范围查询或者范围修改的过
程中,事务 T2 插入了一条属于事务 T1 范围内的数据并且提交了,这时候在事
务 T1 查询发现多出来了一条数据,或者在 T1 事务发现这条数据没有被修改,
看起来像是产生了幻觉,这种现象称为幻读
事务隔离级别包括四个级别:
(1)读未提交:READ_UNCOMMITTED
在这种隔离级别下,可能会产生脏读、不可重复读、幻读。
(2)读提交:READ_COMMITTED
在这种隔离级别下,可能会产生不可重复读和幻读。
(3)可重复读:REPEATABLE_READ
在这种隔离级别下,可能会产生幻读
(4)序列化:SERIALIZABLE
解决了幻读问题,事务排队执行。不支持并发。
这四种隔离级别里面,只有串行化解决了全部的问题,但也意味着这种隔离级别
的性能是最低的。
在 Mysql 里面,InnoDB 引擎默认的隔离级别是 RR(可重复读),因为它需要
保证事务 ACID 特性中的隔离性特征。(Orcal中默认为RC)

三,HashMap 是怎么解决哈希冲突的?
首先,HashMap 底层采用了数组的结构来存储数据元素,数组的默认长度是 16,
当我们通过 put 方法添加数据的时候,HashMap 根据 Key 的 hash 值进行取模
运算,最终保存到数组的指定位置。
但是这种设计会存在 hash 冲突问题,也就是两个不同 hash 值的 key,最终取
模后会落到同一个数组下标
所以 HashMap 引入了链式寻址法来解决 hash 冲突问题,对于存在冲突的 key,
HashMap 把这些 key 组成一个单向链表。然后采用尾插法把这个 key 保存到链表的尾部。
另外,为了避免链表过长的问题,当链表长度大于 8 并且数组长度大于等于 64的时候,HashMap 会把链表转化为红黑树。从而减少链表数据查询的时间复杂度问题,提升查询性能。
最后,我再补充一下,解决 hash 冲突问题的方法有很多,比如
再 hash 法,就是如果某个 hash 函数产生了冲突,再用另外一个 hash 进行计算,
比如布隆过滤器就采用了这种方法。
开放寻址法,就是直接从冲突的数组位置往下寻找一个空的数组下标进行数据存
储,这个在 ThreadLocal 里面有使用到。(但是要保证tableSize大于dataSize)
建立公共溢出区,也就是把存在冲突的 key 统一放在一个公共溢出区里面。
四.Integer与int之间的区别
Integer与int的区别有很多
(1)作为成员变量来说Integer的默认值为null,int的默认值为0
(2)Integer存储在堆内存,int类型是直接存储在栈空间
(3)Integer是一个对象类型,它封装了很多的方法和属性,我们在使用时候更加灵活
为什么要设计成封装类型我认为java本身就是一个面向对象的语言,一切操作都是以对象为基础的,比如说向集合里的存储的元素也只支持存储Object类型普通类型是无法通过集合来存储的。
五,接口和抽象类的区别是什么?
(1)抽象类中的成员变量可以是各种类型 但是接口中的成员变量默认为 public static final 类型。
(2)抽象类可以存在普通成员函数,接口中只能存public abstract方法
(3)抽象类只能继承一个,接口可以继承多个
(4)接口的设计目的是对类的行为进行约束,也就是提供一种机制可以强制不同的类具有相同的行为,它只约束了行为的有无,但不对如何实现进行限制。
(5)抽象类的设计目的 是为了代码的复用 当不同类具有相同的行为也就是说有一些共性的东西这时候就可以把这些共性的东西抽象出来就会派生出来所以说抽象类一定先有子类然后把子类的共性抽象出一个父类,但是这里有些方法是没有实现的所以不能实例化。
(6)接口是对行为的抽象,接口的核心是定义行为,即实现类是可以做什么,至于实现类主体是谁,怎么实现的接口并不关心