Java面试——mysql数据库相关

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_45124488/article/details/102641549

Java面试——mysql数据库相关

1,数据库隔离级别:

隔离级别 隔离级别的值 导致的问题
Read-Uncommited 导致脏读
Read-Commited 1 避免脏读,允许不可重复读和幻读
Repeatable-Read 2 避免脏读、不可重复读,允许幻读
Serializable 3 串行化读,事务只能一个一个执行,避免了脏读、不可重复读、幻读,执行效率慢,慎重使用

2,如果不考虑事务隔离性引发的安全性问题:

  • 脏读:一个事务读到了另一个事务未提交的数据。

  • 不可重复度:一个事务读到了另一个事务已经提交的update的数据导致多次查询结果不一致。

  • 幻读:一个事务读到了另一个事务已经提交的insert数据导致多次查询结果不一致。

3,MySql数据库存储引擎?

1,InnoDB存储引擎
a,InnoDB是事务型数据库的首选引擎,支持事务安全表(ACID),其它存储引擎都是非事务安全表,
支持行锁定和外键,MySQL5.5以后默认使用InnoDB存储引擎。
b,为MySQL提供了具有提交、回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎。
c,MySQL支持外键的存储引擎只有InnoDB,在创建外键的时候,父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引。
2,MyISAM存储引擎
MyISAM基于ISAM存储引擎,并对其进行扩展,它是在web、数据仓库和其他应用环境下最常用的存储引擎之一。
MyISAM拥有较高的插入、查询速度,但不支持事务,不支持外键。
MyISAM的主要特性:
被大文件系统和操作系统支持。
当把删除和更新及插入操作混合使用的时候,动态尺寸的行产生更少碎片。
每个MyISAM表最大索引数是64,这可以通过重新编译来改变。每个索引最大的列数是16。
最大的键长度是1000字节,这也可以通过编译来改变,对于键长度超过250字节的情况,一个超过1024字节的键将被用上。
BLOB和TEXT列可以被索引。
3,MEMORY存储引擎
MEMORY存储引擎将表中的数据存储到内存中,为查询和引用其他表数据提供快速访问。
MEMORY主要特性:
MEMORY表的每个表可以有多达32个索引,每个索引16列,以及500字节的最大键长度。
可以在一个MEMORY表中有非唯一键值。

4,数据库中常见的锁:

  • 行级锁:行级锁是MySql中粒度最细的一种锁,表示只对当前操作的行进行加锁。
    其加锁粒度最小,但加锁的开销也最大。行级锁分为共享锁 和 排他锁。

​ 特点:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。

  • 表级锁:表级锁是MySql数据库中粒度最大的一种锁,表示对当前操作的整张表加锁,实现简单,资源消耗最少,被大部分MySql引擎支持。表级锁定分为表共享读锁(共享锁)与表独占写锁(排他锁)。
    特点:开销小,加锁快,不会出现死锁,锁定粒度大,发出锁冲突的概率最高,并发度最低。
  • 页级锁:页级锁是介于行级锁和表级锁之间的一种锁,表级锁速度快、但冲突多,行级锁速度慢、但冲突少。所以取了折衷的页级,一次锁定相邻的一组记录。BDB 支持页级锁

5,MySQL 常用存储引擎的锁机制

  • MyISAM 和 MEMORY 采用表级锁(table-level locking)
  • BDB 采用页面锁(page-level locking)或表级锁,默认为页面锁
  • InnoDB 支持行级锁(row-level locking)和表级锁, 默认为行级锁

6,如何防止死锁

有多种方法可以避免死锁,这里只介绍常见的三种
1、如果不同程序会并发存取多个表,尽量约定以相同的顺序访问表,可以大大降低死锁机会。
2、在同一个事务中,尽可能做到一次锁定所需要的所有资源,减少死锁产生概率;
3、对于非常容易产生死锁的业务部分,可以尝试使用升级锁定颗粒度,通过表级锁定来减少死锁产生的概率;

猜你喜欢

转载自blog.csdn.net/weixin_45124488/article/details/102641549