2019数据库面试题:事务并发可能会致使哪些问题,mysql默认的是哪一种级别,这种默认的隔离级别可以避免哪些问题?

面试题:事务并发可能会致使哪些问题,数据库的隔离级别有哪些,mysql默认的是哪一种级别,这种默认的隔离级别可以避免哪些问题?

1、不考虑隔离性,事务存在3种并发访问问题 :

一、脏读:B事务读取到了A事务还没有提交的数据
二、不可重复读:一个事务中两次读取的数据的内容不一致
三、幻读/虚读:一个事务中两次读取的数据的数量不一致mysql

1.脏读web

脏读是指在一个事务处理过程里读取了另外一个未提交的事务中的数据。面试

当一个事务正在屡次修改某个数据,而在这个事务中这屡次的修改都还未提交,这时一个并发的事务来访问该数据,就会形成两个事务获得的数据不一致。sql

举个例子,A在一个转帐事务中,转了100块钱给B,此时B读到了这个转帐的数据,而后作了一些操做(发货给A,或者其余的),但是这时候A的事务并无提交,若是A回滚了事务,那就GG了。这就是脏读了。数据库

2.不可重复读安全

不可重复读是指在对于数据库中的某个数据,一个事务范围内屡次查询却返回了不一样的数据值,这是因为在查询间隔,被另外一个事务修改并提交了。session

例如事务T1在读取某一数据,而事务T2立马修改了这个数据而且提交事务给数据库,事务T1再次读取该数据就获得了不一样的结果,发送了不可重复读。并发

不可重复读和脏读的区别是,脏读是某一事务读取了另外一个事务未提交的脏数据,而不可重复读则是读取了前一事务提交的数据。oracle

在某些状况下,不可重复读并非问题,好比咱们屡次查询某个数据固然以最后查询获得的结果为主。但在另外一些状况下就有可能发生问题,例如对于同一个数据A和B依次查询就可能不一样,A和B就可能打起来了……svg

3.幻读

幻读是事务非独立执行时发生的一种现象。例如事务T1对一个表中全部的行的某个数据项作了从“1”修改成“2”的操做,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值仍是为“1”而且提交给数据库。而操做事务T1的用户若是再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉同样,这就是发生了幻读。

幻读和不可重复读都是读取了另外一条已经提交的事务(这点就脏读不一样),所不一样的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据总体(好比数据的个数)。

2、数据库的隔离级别

一、read uncommitted : 读未提交 :哪一个问题都不能解决
二、read committed:读已提交 :能够解决脏读 —- oracle默认的
三、repeatable read:可重复读:能够解决脏读和不可重复读 —mysql默认的
四、serializable:串行化:能够解决脏读不可重复读和虚读—至关于锁表

① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
 ② Repeatable read (可重复读):可避免脏读、不可重复读的发生。
 ③ Read committed (读已提交):可避免脏读的发生。
 ④ Read uncommitted (读未提交):最低级别,任何状况都没法保证。

在MySQL数据库中,支持上面四种隔离级别,默认的为Repeatable read (可重复读);而在Oracle数据库中,只支持Serializable (串行化)级别和Read committed (读已提交)这两种级别,其中默认的为Read committed级别。

Mysql 查询事务的隔离级别

select @@tx_isolation;

在MySQL数据库中设置事务的隔离 级别:

set  [glogal | session]  transaction isolation level 隔离级别名称;
set tx_isolation=’隔离级别名称;’

Mysql的两种存储引擎区别

Innodb引擎

Innodb引擎提供了对数据库ACID事务的支持,而且实现了SQL标准的四种隔离级别。该引擎还提供了行级锁和外键约束,它的设计目标是处理大容量数据库系统,它自己其实就是基于MySQL后台的完整数据库系统,MySQL运行时Innodb会在内存中创建缓冲池,用于缓冲数据和索引。可是该引擎不支持FULLTEXT类型的索引,并且它没有保存表的行数,当SELECT COUNT(*) FROM TABLE时须要扫描全表。当须要使用数据库事务时,该引擎固然是首选。因为锁的粒度更小,写操做不会锁定全表,因此在并发较高时,使用Innodb引擎会提高效率。可是使用行级锁也不是绝对的,若是在执行一个SQL语句时MySQL不能肯定要扫描的范围,InnoDB表一样会锁全表。

MyIASM引擎

MyIASM是MySQL默认的引擎,可是它没有提供对数据库事务的支持,也不支持行级锁和外键,所以当INSERT(插入)或UPDATE(更新)数据时即写操做须要锁定整个表,效率便会低一些。不过和Innodb不一样,MyIASM中存储了表的行数,因而SELECT COUNT(*) FROM TABLE时只须要直接读取已经保存好的值而不须要进行全表扫描。若是表的读操做远远多于写操做且不须要数据库事务的支持,那么MyIASM也是很好的选择。

主要区别:

一、MyIASM是非事务安全的,而InnoDB是事务安全的

二、MyIASM锁的粒度是表级的,而InnoDB支持行级锁

三、MyIASM支持全文类型索引,而InnoDB不支持全文索引

四、MyIASM相对简单,效率上要优于InnoDB,小型应用能够考虑使用MyIASM

五、MyIASM表保存成文件形式,跨平台使用更加方便

应用场景:

一、MyIASM管理非事务表,提供高速存储和检索以及全文搜索能力,若是再应用中执行大量select操做,应该选择MyIASM

二、InnoDB用于事务处理,具备ACID事务支持等特性,若是在应用中执行大量insert和update操做,应该选择InnoDB