吐血整理!这200道阿里P6必备Java面试题,我简直太爱了( 九 )

  • drop会删除记录和结构 , 不会激活触发器 。
  • 删除速度来讲 , drop > truncate > delete
  • 什么是内联接、左外联接、右外联接?
    • 内联接(Inner Join):匹配2张表中相关联的记录 。(2张表中没有关联的部分抛弃)
    • 左外联接(Left Outer Join):除了匹配2张表中相关联的记录外 , 还会匹配左表中剩余的记录 , 右表中未匹配到的字段用NULL表示 。(以左边记录匹配 , 如果右表中没有记录与其匹配 , 字段值为NULL)
    • 右外联接(Right Outer Join):除了匹配2张表中相关联的记录外 , 还会匹配右表中剩余的记录 , 左表中未匹配到的字段用NULL表示 。(以右边记录匹配 , 如果左表中没有记录与其匹配 , 字段值为NULL)
    并发事务带来哪些问题?
    • 脏读(Dirty read) , 当一个事务读取了数据 , 并且修改了 , 但还未提交到数据库中 , 另外一个事务也读取了数据 , 并且使用了该数据 , 这时另外一个数据读取到的数据就是“脏数据” , 根据“脏数据”所做的处理可能是不正确的 。
    • 丢失修改(Lost to modify) , 当一个事务读取了数据 , 另外一个事务也读取了数据 , 在第一个事务修改了数据后 , 第二个事务也修改了数据 , 这样第一个事务的修改则被丢失 , 因为为“丢失修” , 例如事务1读取了数据A=20 , 事务2也读取了A=20 , 事务1修改A=A1 , 事务2也修改A=A-1 , 最终结果为A=19 , 事务1的修改被丢失了 。
    • 不可重复读(Unrepeatableread) , 指一个事务多次读取1个数据 , 在这个事务还未结束时 , 另外一个事务也访问该数据 , 如果第二个事务修改了数据 , 导致第一个事务的多次读取的数据结果可能是不一样的 , 因此成为不可重复读 。
    • 幻读(Phantom read) , 幻读和不可重复读类似 , 它发生在一个事务读取了几行数据 , 接着另外一个事务插入了一些数据 , 在随后的查询中 , 第一个事务发现多了一些原本不存在的数据 , 就像产生了幻觉一样 , 所以称为幻读 。
    不可重复读和幻读的区别
    • 不可重复读的重点是修改 , 例如多次读取一条记录 , 发现记录的某一列的值被修改 。
    • 幻读的重点是新增或减少 , 例如多次读取 , 发现记录增多或减少了 。
    事务隔离级别有哪些?MySQL的默认隔离级别是?SQL 标准定义了四个隔离级别
    • READ-UNCOMMITTED(读取未提交):最低的隔离级别 , 允许读取尚未提交的数据变更 , 可能会导致脏读、幻读或不可重复读 。
    • READ-COMMITTED(读取已提交): 允许读取并发事务已经提交的数据 , 可以阻止脏读 , 但是幻读或不可重复读仍有可能发生 。
    • REPEATABLE-READ(可重复读): 对同一字段的多次读取结果都是一致的 , 除非数据是被事务本身自己所修改 , 可以阻止脏读和不可重复 读 , 但幻读仍有可能发生 。
    • SERIALIZABLE(可串行化): 最高的隔离级别 , 完全服从ACID的隔离级别 。所有的事务依次逐个执行 , 这样事务之间就完全不可能产生干扰 , 也就是说 , 该级别可以防止脏读、不可重复读以及幻读 。
    • MySQL InnoDB 存储引擎的默认支持的隔离级别是 REPEATABLE-READ(可重读) , 我们可以通过 SELECT @@tx_isolation; 命令来查看 。
    但要注意 , MySQL InnoDB在 REPEATABLE-READ(可重读)隔离级别下 , 使用的是Next-Key Lock 锁算法 , 因此可以避免幻读的产生 , 所以MySQL默认的的隔离级别 , REPEATABLE-READ级别也达到了SERIALIZABLE(可串行化)级别的隔离要求 。因为级别越高 , 事务请求的锁越多 , 所以大部分的数据库隔离级别都是READ-COMMITTED(读取已提交) 。
    大表如何优化?