mysql面试问题总结

1、增删改查语句

select 列名 from 表名 where 条件

insert into 表名(“表内字段”,“字段2”)value(“xxx”,“xxxxx”);

delete from 表名 where 条件

update 表名 set 字段1=value,字段2=value2 where 条件 ;

2、数据类型有哪些;

整型(xxxint)
位类型(bit)
浮点型(float和double、real)
定点数(decimal,numeric)
日期时间类型(date,time,datetime,year)
字符串(char,varchar,xxxtext)
二进制数据(xxxBlob、xxbinary)
枚举(enum)
集合(set)

3、约束都有哪些,每种约束的含义

主键约束:primary key

非空约束:not null

唯一约束:unique

外键约束:foreign key

默认值约束 (Default)

自增约束(AUTO_INCREMENT)

4、多表查询,内连接、左右链接等

完成多表操作的两种方式:

​ (1)通过表连接查询
​ (2)通过子查询

消除笛卡尔积问题

SELECT * FROM dept,employee;

设置过滤条件

指定过滤条件 主表.主键=从表.外键

SELECT * FROM dept,employee WHERE dept.id = employee.dept_id;

内连接
隐式内连接

看不到join关键字的语句 使用where指定条件,可以解决笛卡尔积问题

显式外连接

select 列名 from左表 inner join 右表 on 主表.主键= 从表.外键

左外连接

查询的数据以左表为准,即使在其他表中没有匹配的记录也会显示出来

select 列名 from 左表 left join 右表 on 表连接条件

右外连接

查询数据以右表为准,即使在其他表中没有匹配的记录也会显示出来

select 列名 from 左表 right join 右表 on 表连接的条件

全连接

Oracle支持全连接但是Mysql不支持全连接,我们可以使用union 连接左右连接达到目的

5、联合查询

简单说就是将两次查询合二为一

使用union all 但是加上all 会有重复 去掉可以去重

联合查询 多次查询的字段列表必须是一样的

6、常用函数

数学函数

ABS(x)取绝对值

PI()返回圆周率默认后六位

SQRT(x) 取平方根 只有正数有,负数返回null

MOD(x,y)取余函数,取得下x/y的余数,小数也行

ROUND(x,y)返回x的四舍五入的有y位小数

聚合函数

AVG(col)返回指定列的平均值
COUNT(col)返回指定列中非NULL值的个数
MIN(col)返回指定列的最小值
MAX(col)返回指定列的最大值
SUM(col)返回指定列的所有值之和
GROUP_CONCAT(col) 返回由属于一组的列值连接组合而成的结果

7、存储过程的用法

存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象。

储存过程语法

create procedure 名称()
begin
.........
end

8、创建用户的sql语句及grant赋权的sql语句

create user

create user ‘用户名’@‘主机名’ identified by ‘密码’;

使用password()获取密码的哈希值 password(‘xxx’);

create user ‘用户名’@‘主机名’ identified by password ‘加密后密码’;

insert user

INSERT INTO

mysql.user(Host, User, authentication_string, ssl_cipher, x509_issuer, x509_subject)
VALUES (‘hostname’, ‘username’, PASSWORD(‘password’), ‘’, ‘’, ‘’);

由于 mysql 数据库的 user 表中,ssl_cipher、x509_issuer 和 x509_subject 这 3 个字段没有默认值,所以向 user 表插入新记录时,一定要设置这 3 个字段 的值,否则 INSERT 语句将不能执行。

新建用户后要刷新权限

FLUSH PRIVILEGES;

grant语句创建用户

GRANT priv_type ON database.table TO user [IDENTIFIED BY [PASSWORD] 'password']

priv_type 参数表示新用户的权限;
database.table 参数表示新用户的权限范围,即只能在指定的数据库和表上使用自己的权限;
user 参数指定新用户的账号,由用户名和主机名构成;
IDENTIFIED BY 关键字用来设置密码;
password 参数表示新用户的密码。

9、drop,delete 与 truncate 的区别

  1. delete:删除表中的特定行,不会删除表本身。
  2. truncate:删除表中所有行,但保留表本身。
  3. drop:完全删除整个表,包括表本身和其中的数据。

10、varchar 和 char 的使用场景

char 的长度是不可变的,而 varchar 的长度是可变的。

定义一个 char [10] 和 varchar [10]。
如果存进去的是‘csdn’, 那么 char 所占的长度依然为 10,除了字符‘csdn’外,后面跟六个空格,varchar 就立马把长度变为 4 了,取数据的时候,char 类型的要用 trim () 去掉多余的空格,而 varchar 是不需要的。

2.char 的存取速度还是要比 varchar 要快得多,因为其长度固定,方便程序的存储与查找。
char 也为此付出的是空间的代价,因为其长度固定,所以难免会有多余的空格占位符占据空间,可谓是以空间换取时间效率
varchar 是以空间效率为首位。

3.char 的存储方式是:对英文字符(ASCII)占用 1 个字节,对一个汉字占用两个字节。
varchar 的存储方式是:对每个英文字符占用 2 个字节,汉字也占用 2 个字节。

4.两者的存储数据都非 unicode 的字符数据。

varchar的适用场景:

字符串的最大长度比平均长度大很多
字符串列很少被更新
使用了多字节字符集存储字符串

char类型的适用场景:

适合存储长度近似的值
适合存储短字符串
适合存储经常更新的字符串列

11、关系型数据库和非关系型数据库区别

1、数据存储方式不同。

关系型数据天然就是表格式的,因此存储在数据表的行和列中,结构化存储。
非关系型数据通常存储在数据集中,就像文档、键值对、列存储、图结构。

2、扩展方式不同。

在基于web的结构中,关系型数据库是最难以横向拓展的,当一个应用系统的用户量和访问量与日俱增的时候,数据库没有办法像web Server那样简单的通过添加更多的硬件和服务节点来拓展性能和负载能力。通常要优化机器性能。
而非关系型数据存储天然就是分布式的,NoSQL数据库是横向扩展的,可以通过给资源池添加更多普通的数据库服务器(节点)来分担负载。

3、对事务性的支持不同。

如果数据操作需要高事务性或者复杂数据查询需要控制执行计划,那么传统的SQL数据库从性能和稳定性方面考虑是你的最佳选择。
NoSQL数据库是最终一致性,一般不保证ACID的数据存储系统,具有极高的并发读写性能,真正闪亮的价值是在操作的扩展性和大数据量处理方面。

12、请说出mysql存储引擎及区别(innodb、myisam)

什么是mysql引擎

简单来说: mysql存储引擎就是指表的类型以及表在计算机上的存储方式

不同的存储引擎决定了Mysql数据库中的表可以用不同的方式来存储,我们可以根据数据的特点来选择不同的存储引擎。

Myisam和innodb特点

innodb是事务型数据库的首选引擎,是目前mysql的默认事务型引擎,是目前最重要使用最广泛的存储引擎。支持事务安全表ACID,支持行锁定和外键。

myisam是mysql的引擎之一,不支持数据库事务,也不支持行级锁和外键。

如何选择InnoDB和MyISAM:

1.InnoDB:如果需要对事务的完整性要求比较高,要求实现并发控制,那选择InnoDB有很大的优势。如果需要频繁的更新、删除操作的数据库,也可以选择InnoDB,因为支持事务的提交和回滚。
2.MyISAM:读取数据快,空间和内存使用比较低。如果表主要是用于读取记录,那么选择MyISAM能实现处理高效率。如果应用的完整性、并发性要求比较低,也可以使用

myisam和innodb区别

1.InnoDB是MySQL默认的存储引擎。
2.只有 InnoDB 支持事务,MyISAM不支持事务。
3.MyISAM不支持行级锁和外键, InnoDB支持。
4.InnoDB表的大小更加的大,用MyISAM可省很多的硬盘空间。
5.InnoDB 引擎的索引和文件是存放在一起的,找到索引就可以找到数据,是聚簇式设计。
6.MyISAM 引擎采用的是非聚簇式(即使是主键)设计,索引文件和数据文件不在同一个文件中

13、binlog日志模式有哪些?内容是什么?

Statement Level模式

每一条修改数据的SQL都会记录到master的Binlog中,slave在复制的时候,SQL进程会将它们解析出来,在slave库上再次执行。

优点:statement level下的优点首先就是它只需要记录在master上所执行的语句的细节,以及执行语句时候的上下文信息。解决了row level下的缺点,不需要记录每一行的变化,较少Binlog日志量,节约IO,提高性能。

缺点:由于它是记录执行语句,所以,为了让这些语句在slave端也能正确执行,那么它还必须记录每条语句在执行的时候的一些相关信息,也就是上下文信息,来保证所有语句在slave端能够得到和在master端相同的执行结果。由于MySQL更新较快,使mysql的赋值遇到了不小的挑战,自然赋值的时候就会涉及到越复杂的内容,bug也就容易出现。在statement level下,目前就已经发现了不少情况会造成mysql的复制出现问题,主要是修改数据的时候使用了某些特定的函数或者功能的时候会出现。比如:sleep()函数在有些版本中就不能正确赋值,在存储过程中使用了last_insert_id()函数,可能会使slave和master上得到不一致的id等等。由于row level是基于每一行记录的变化,所以不会出现类似的问题。

总结:

优点:解决了row level的缺点,不需要记录每一行的变化。日志量少,节约IO,从库应用日志块。

缺点:一些新功能同步可能会有障碍,比如函数、触发器等。

Row Level模式

日志中会记录成每一行数据修改的形式,然后在slave端再对相同的数据进行修改。

优点:在row level的模式下,binlog中可以不记录执行的SQL语句的上下文信息,仅仅只需要记录哪一条记录被修改,修改成什么样。所以row level的日志内容会非常清楚的记录每一行数据修改的细节,非常容易理解。而且不会出现某些特定情况下的存储过程,或fuction,以及trigger的调用或触发无法被正确复制的问题。

缺点:row level模式下,所有的执行语句都会记录到日志中,同时都会以每行记录修改的来记录,这样可能会产生大量的日志内容。

总结:

优点:记录详细。解决statement level模式无法解决的复制问题。

缺点:日志量大,因为是按行来拆。

Mixed模式(混合模式)

实际上就是前两种模式的结合,在mixed模式下,MySQL会根据执行的每一条具体的sql语句来区分对待记录的日志形式,也是在statement和row之间选择一种。

新版本中的mysql中对row level模式也做了优化,并不是所有的修改都会以row level来记录,像遇到表结构变更的时候就会以statement模式来记录,如果SQL语句确实就是update或者delete等修改数据的语句,那么还是会记录所有行的变更。

14、mysql数据备份是怎么备份的?有哪几种备份方式?

1 使用mysqldump命令行工具进行备份:该工具可以将数据库中的表结构和数据导出成SQL脚本文件,可以使用该文件进行恢复。
2 使用MySQL的物理备份工具:例如Percona XtraBackup、Mariabackup等,这些工具可以对MySQL数据库进行增量备份和全量备份,备份的数据为二进制文件,可以直接用于还原。
3 mySQL主从备份:通过配置MySQL主从复制,将数据从主库同步到从库,然后对从库进行备份,以保证备份的数据是与主库一致的。
4 第三方备份工具:例如Zmanda、mydumper等,这些工具提供了更加灵活的备份方式,可以根据需求选择不同的备份方式和存储位置。

Mysql 备份几种范例
1. 备份整个数据库
mysqldump -u username -p dbname > backup.sql

2 备份指定表
mysqldump -u username -p dbname table1 table2 > backup.sql

3. 压缩备份文件
mysqldump -u username -p dbname | gzip > backup.sql.gz

4. 回复备份文件
mysql -u username -p dbname < backup.sql

15、SQL 的查询优化包括哪几个方面?

1、基本写法优化

1、少使用select * ,尽量使用具体字段;

2、对于条件来说等号两边的字段类型要一致,字符串不加单引号索引会失效;

3、尽量少使用Order By 排序,对于需要多个字段进行排序的可以使用组合索引;

4、对于group by 语句要先过滤后分组;

5、在查询时减少使用null,对字段有多个null的可以加默认值;

6、少使用like,对于需要使用的, 如需要使用尽量用 like abc%这种,不要把%放字段前面;

7、在where后面少使用函数或者算数运算;

8、去除的distinct 过滤字段要少,避免 distinct * ;

9、不要超过5个以上的表连接。

2、建立使用合适索引;

1、对于高频筛选字段可以适当的建立索引;

2、一个表的索引最好不要超过5个,多了会影响插入修改;

3、不要对值是有限重复的字段建立索引,如性别等;

4、使用组合索引一定要遵守最左原则;

3、替代优化

1、不要使用not in 和<>,这个会破坏索引,not in 可以用not exists 来代替,<>可以分成两个条件 >或者<等;

2、使用连接(join)来代替子查询;

16、索引的作用是什么?

第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
第二,可以大大加快 数据的检索速度,这也是创建索引的最主要的原因。
第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
第四,在使用分组和排序 子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。

17、B+索引和 hash 索引是什么?

哈希索引

哈希索引(hash index)基于哈希表实现,只有精确匹配索引所有列的查询才有效。对于每一行数据,存储引擎都会对所有的索引列计算一个哈希码(hash code),哈希码是一个较小的值,并且不同键值的行计算出来的哈希码也不一样。哈希索引将所有的哈希码存储在索引中,同时在哈希表中保存指向每个数据行的指针。对于hash相同的,采用链表的方式解决冲突。类似于hashmap。因为索引的结构是十分紧凑的,所以hash索引的查询很快。
哈希索引比起B树索引简单,因为它不需要遍历B树,所以访问速度会更快。

特点:

1,哈希索引只包含哈希值和行指针,而不存储字段值,所以不能直接使用索引中的值来读取行。
2,哈希索引数据并不是按照索引值顺序存储的,所以也就无法用于排序。
3,哈希索引也不支持部分索引列匹配查找,因为哈希索引始终是使用索引列的全部内容来计算哈希值的。
4,哈希索引只支持等值比较查询,包括=、IN()、<>(注意<>和<=>是不同的操作)。也不支持任何范围查询,例如WHERE price>100。
5,访问哈希索引的数据非常快,除非有很多哈希冲突(不同的索引列值却有相同的哈希值)。当出现哈希冲突的时候,存储引擎必须遍历链表中所有的行指针,逐行进行比较,直到找到所有符合条件的行。
6,如果哈希冲突很多的话,一些索引维护操作的代价也会很高。例如,如果在某个选择性很低(哈希冲突很多)的列上建立哈希索引,那么当从表中删除一行时,存储引擎需要遍历对应哈希值的链表中的每一行,找到并删除对应行的引用,冲突越多,代价越大。

B+树

1.全值匹配:指的是和索引中所有列进行匹配。假设以(姓,名,出生日期)三个数据项建立复合索引,那么可以查找姓名为张三,出生日期在2000-12-12的人

2.匹配最左前缀:假设以(姓,名,出生日期)三个数据项建立复合索引,可以查找所有姓张的人

3.匹配列前缀:假设有姓为司徒的人,我们也可以查找第一列的前缀部分,如查找所有以司开头的姓的人

4.匹配范围值:可以查找所有在李和张之间的姓的人,注意范围查询只在复合索引的优先排序的第一列。(假设姓名按照拼音排序)

5.精确匹配前面列并范围匹配后一列:可以查找姓李并出生日期在2000-12-12之后的人或姓名为张三并出生日期在2000-12-12之后的人,注意范围第一个范围查询后面的列无法再使用索引查询

6.只访问索引的查询:即查询只需访问索引,而无需访问数据行

B+ Tree索引缺点

1.如果不是按照索引的最左列开始查找,则无法使用索引。如无法查找名为龙的人,也无法查找在2000-12-12之后出生的人,当然也无法查找姓中以龙结尾的人(注意为和含有的区别)

2.不能跳过索引中的列:无法查找姓李并在2000-12-12之后出生的人

3.如果查询中包括某个列的范围查询,则其右边所有列都无法使用索引优化查询

18、索引的优缺点,什么时候使用索引?什么时候不能使用索引?

索引的优点:

1.加快查询或者检索的速度;

2.加快表关联的效率,在进行表关联时,可以对关联的字段建立索引;

3.使用分组或者排序的时候,可以减少分组或者排序的时间;

4.建立唯一索引,可以保证表中数据的唯一性等。

索引的缺点:

1.在数据分析或者开发或者中,创建索引和维护索引需要耗费大量的时间;

2.索引会占用物理空间,数据量越大,所用的空间也就越大;

3.索引会降低增删改的效率,因为每次增删改时都需要对索引进行动态维护等。

索引的使用场景

1.主键建立唯一索引,创建表中指定某个列为主键列时,索引会自动创建;

2.频繁作为查询条件的字段建立索引;

3.排序时所用的字段建立索引;

4.分组时所用的字段建立索引;

5.常用于统计的字段建立索引等。

索引不适用的场景

1.常更新的字段不应该建立索引,因为更新不单单更新记录,还会更新索引,保存索引文件;

2.过滤条件中用不到的字段,不应该建立索引;

3.表数据量很小,不应该建立索引,比如一张班级表,一个班就几十号人,建不建没有任何差别;

4.常进行增删改的表,不应该建立索引;

5.数据重复且分布较均匀的字段,不应该创建索引,比如性别,只有男女,建立没有任何意义等。

19、Mysql中索引的设计

一、MySQL常用的索引类型

1.1主键索引

primary key

1.2唯一索引

unique

1.3普通索引

index

1.4全文索引

1.5组合索引

二、MySQL常用的数据结构

2.1B-tree

2.2哈希索引

三、索引的设计原则

3.1选择唯一性索引

被设为唯一性的值可以设置为索引,这样能快速定位到某条记录

3.2为经常需要排序、分组和联合操作的字段建立索引

经常需要order by,group by,distinct,union操作的字段可以设置为索引,因为排序需要很多时间

3.3为常作为查询条件的字段建立索引

查询需要消耗很多时间,所以可以将需要经常查询的字段作为索引

3.4限制索引的数目

不是索引的数目越多越好,建立索引会占用磁盘空间,并且当数据更新时,除了跟新数据库中,还要跟新索引中的数据,这样使更新操作变的复杂,需要大量的时间

3.5尽量使用前缀来索引

如果索引字段比较长,尽量使用前缀来索引,比如TEXT和BLOG类型,只需前缀就可定位到对应字段,如果使用全文索引会浪费很多时间

3.6尽量使用数据量少的索引

如果所以的值很长,那么索引的速度也会降低

3.7删除不再使用或者很少使用的索引

索引的存在会将表的更新操作变的繁琐,并且占用磁盘空间,应定期检查不需要的索引,并将其删除

20、B+索引和B树索引,各自的区别

第一 在B树中非叶子节点和叶子节点都会存放数据,而B+树的所有的数据都会出现在叶子节点,在查询的时候,B+树查找效率更加稳定。

第二 在进行范围查询的时候,B+树的效率高,因为B+树都在叶子节点存储,并且叶子节点是一个双向链表。

21、衡量事务的四大特性

原子性,一致性,隔离性,持久性

A向B转账500,转账成功,A扣除500元,B增加500元,原子操作体现在要 么都成功,要么都失败

在转账的过程中,数据要一致,A扣除了500,B必须增加500

在转账的过程中,隔离性体现在A像B转账,不能受其他事务干扰

在转账的过程中,持久性体现在事务提交后,要把数据持久化(可以说是落盘操作)

22、mysql的日志有哪些?binlog、错误日志、redo log、undo log,每个日志是用来干什么的?

undo

利用Undo日志也称回滚日志,存储上一个一致性的状态,可以简单理解为记录了与执行sql相反的一条语句。

Undo log 是为了实现事务的原子性,在mysql数据InnoDB存储引擎中,还用Undo log 来实现多版本并发控制简称(MVCC)

redo log

MySQL的innoDB存储引擎,使用了redo log 保证事务的持久性。

当事务提交时,必须先将事务的所有日志写入日志文件进行持久化,就是我们常说的WAL(write ahead log) 机制(这个技术是保障持久性的关键技术,在HBase中扮演重要角色)。这样才能保证断电或宕机等情况发生后,已提交的事务不会丢失。这个叫crash-safe。

Redo log包括两部分 重做日志缓冲redo log buffer 和重做日志文件(redo log file)前者是易失的缓存,后者是持久化的文件。

undo log 和redo log 区别

redo log 日志记录的是数据页的物理变化。服务宕机可以用来同步数据。

而undo log 不同,它主要记录的是逻辑日志,当事务回滚时,通过逆操作恢复原来的数据,比如我们删除一条数据的时候,就会在undo log 日志文件中新增一条delete 语句,如果发生回滚就执行逆操作。

redo log 保证事务的持久性,undo log 保证事务的原子性,一致性。

binlog

binlog基本概念
binlog是属于MySQL Server层面的,又称为归档日志,属于逻辑日志,是以二进制的形式记录的,用于记录数据库执行的写入性操作(不包括查询)信息,依靠binlog是没有crash-safe能力的

redolog和binlog区别
redo log是属于innoDB层面,binlog属于MySQL Server层面的,这样在数据库用别的存储引擎时可以达到一致性的要求。
redo log是物理日志,记录该数据页更新的内容;binlog是逻辑日志,记录的是这个更新语句的原始逻辑
redo log是循环写,日志空间大小固定;binlog是追加写,是指一份写到一定大小的时候会更换下一个文件,不会覆盖。
binlog可以作为恢复数据使用,主从复制搭建,redo log作为异常宕机或者介质故障后的数据恢复使用。

redo log是InnoDB存储引擎层的日志,binlog是MySQL Server层记录的日志, 两者都是记录了某些操作的日志(不是所有)自然有些重复(但两者记录的格式不同)。

啥是逻辑日志啥是物理日志:

逻辑日志:可以简单理解为记录的就是sql语句
物理日志:因为mysql数据最终是保存在数据页中的,物理日志记录的就是数据页变更

另外,binlog是通过追加的方式进行写入的,可以通过max_binlog_size参数设置每个binlog文件的大小,当文件大小达到给定值之后,会生成新的文件来保存日志。

23、隔离性中的写操作是怎么实现的?

在事务的隔离性中,写操作的实现方式可以通过以下几种方式来完成:

  1. 悲观锁:在写操作期间,对相关的数据加上互斥锁,以防止其他事务同时修改该数据。这种方式会导致并发性能下降,因为其他事务需要等待锁的释放才能进行写操作。
  2. 乐观并发控制(Optimistic Concurrency Control,简称O如果发生了变化,则表示在事务执行期间有其他事务对该数据进行了修改,事务需要回滚。这种方式不会对数据加锁,提高了并发性能。
  3. 冲突检测:在写操作进行时,系统会检测其他事务是否对同一数据进行了修改。如果发现冲突,则需要回滚事务。该方式可以通过读取锁和写入锁来实现。
  4. MVCC(Multi-Version Concurrency Control):在写操作进行时,不直接修改原始数据,而是创建一个新的版本,保留原始数据的副本。其他事务可以继续读取原始数据,从而实现并发读取。只有在事务提交时,才会将新版本的数据应用到原始数据上。

综上所述,隔离性中的写操作可以通过悲观锁、乐观并发控制、冲突检测和MVCC等方式来实现。具体采用哪种方式取决于数据库管理系统的实现和隔离级别的设定。

24、隔离性中的读操作的三种情况(脏读、不可重复读和幻读)

多个事务的并发进行时经常发生的,并发也是必然。有可能导致一些问题。

第一个是脏读

当一个事务正在访问数据并且对数据进行修改,而这种修改还没有提交到数据库中,这时另外一个事务也访问了这个数据,因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是脏数据,依据脏数据所做的操作可能是不正确的。

第二个是不可重复读

比如在一个事务内多次读同一个数据。在这个事务还没有结束时,另一个事务也访问该数据。那么在第一个事务中的两次读的数据可能不太一样。这就发生了在一个事务内两次读到的数据是不一样的情况,因此称为不可重复读.

第三个是幻读

幻读与不可重复读类似,它发生在一个事务T1读取了几行数据,接着另一个并发事务T2插入了一些数据时,在随后的查询中,第一个事务T1就会发现多了一些原本不存在的记录,就好像发生了幻觉一样。

25、隔离级别(读未提交、读已提交(如Oracle)或可重复读、可串行化)

解决方案是对事务进行隔离。

MySQL支持四种隔离级别

未提交读:不能解决问题,一般项目也不用

读已提交:可以解决脏读,不能解决不可重复读和幻读。

可重复读 :可以解决脏读和和不可重复读,不能解决幻读。

串行化:能解决三个问题,但是由于是让事务串行执行,性能低。

一般默认使用的隔离级别就是 可重复读。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值