MySQL 事务的面试题总结

事务是什么?

事务是一系列的数据库操作,是数据库应用的基本单位。MySQL 事务主要用于处理操作量大,复杂度高的数据。

事务有哪些特性?

在 MySQL 中只有 InnDB 引擎支持事务,它的四个特性如下:

  • 原子性(Atomic):要么全部执行,要么全部不执行;
  • 一致性(Consistency):事务的执行使得数据库从一种正确状态转化为另一种正确状态;
  • 隔离性(Isolation):在事务正确提交之前,不允许把该事务对数据的任何改变提供给其他事务;
  • 持久性(Durability):事务提交后,其结果永久保存在数据库中。

MySQL 中有几种事务隔离级别?分别是什么?

MySQL 中有四种事务隔离级别,它们分别是:

  • read uncommited:未提交读,读到未提交数据;
  • read committed:读已提交,也叫不可重复读,两次读取到的数据不一致;
  • repetable read:可重复读;
  • serializable:串行化,读写数据都会锁住整张表,数据操作不会出错,但并发性能极低,开发中很少用到。

MySQL 默认使用 REPEATABLE-READ 的事务隔离级别。

幻读和不可重复读的区别?

  • 不可重复读的重点是修改:在同一事务中,同样的条件,第一次读的数据和第二次读的数据不一样。(因为中间有其他事务提交了修改)。
  • 幻读的重点在于新增或者删除:在同一事务中,同样的条件,,第一次和第二次读出来的记录数不一样。(因为中间有其他事务提交了插入/删除)。

并发事务一般有哪些问题?

  • 更新丢失(Lost Update):当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,由于每个事务都不知道其他事务的存在,就会发生丢失更新问题,最后的更新覆盖了由其他事务所做的更新。例如,两个编辑人员制作了同一文档的电子副本,每个编辑人员独立地更改其副本,然后保存更改后的副本,这样就覆盖了原始文档。 最后保存其更改副本的编辑人员覆盖另一个编辑人员所做的更改,如果在前一个编辑人员完成并提交事务之前,另一个编辑人员不能访问同一文件,则可避免此问题。

  • 脏读(Dirty Reads):一个事务正在对一条记录做修改,在这个事务完成并提交前, 这条记录的数据就处于不一致状态; 这时, 另一个事务也来读取同一条记录,如果不加控制,第二个事务读取了这些脏数据,并据此做进一步的处理,就会产生未提交的数据依赖关系,这种现象被形象地叫做脏读。

  • 不可重复读(Non-Repeatable Reads):一个事务在读取某些数据后的某个时间,再次读取以前读过的数据,却发现其读出的数据已经发生了改变、或某些记录已经被删除了!这种现象就叫做“不可重复读” 。

  • 幻读(Phantom Reads): 一个事务按相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据,这种现象就称为“幻读” 。

并发事务有什么什么问题?应该如何解决?

并发事务可能造成:脏读、不可重复读和幻读等问题 ,这些问题其实都是数据库读一致性问题,必须由数据库提供一定的事务隔离机制来解决,解决方案如下:

  • 加锁:在读取数据前,对其加锁,阻止其他事务对数据进行修改。
  • 提供数据多版本并发控制(MultiVersion Concurrency Control,简称 MVCC 或 MCC),也称为多版本数据库:不用加任何锁, 通过一定机制生成一个数据请求时间点的一致性数据快照(Snapshot), 并用这个快照来提供一定级别 (语句级或事务级) 的一致性读取,从用户的角度来看,好象是数据库可以提供同一数据的多个版本。

什么是 MVCC?

MVCC 全称是多版本并发控制系统,InnoDB 和 Falcon 存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决幻读问题。

MVCC 是怎么工作的?

InnoDB 的 MVCC 是通过在每行记录后面保存两个隐藏的列来实现,这两个列一个保存了行的创建时间,一个保存行的过期时间(删除时间)。当然存储的并不是真实的时间而是系统版本号(system version number)。每开始一个新的事务,系统版本号都会自动新增,事务开始时刻的系统版本号会作为事务的版本号,用来查询到每行记录的版本号进行比较。

REPEATABLE READ(可重读)隔离级别下 MVCC 如何工作?

  • SELECT:InnoDB 会根据以下条件检查每一行记录:第一,InnoDB 只查找版本早于当前事务版本的数据行,这样可以确保事务读取的行要么是在开始事务之前已经存在要么是事务自身插入或者修改过的。第二,行的删除版本号要么未定义,要么大于当前事务版本号,这样可以确保事务读取到的行在事务开始之前未被删除。
  • INSERT:InnoDB 为新插入的每一行保存当前系统版本号作为行版本号。
  • DELETE:InnoDB 为删除的每一行保存当前系统版本号作为行删除标识。
  • UPDATE:InnoDB 为插入的一行新纪录保存当前系统版本号作为行版本号,同时保存当前系统版本号到原来的行作为删除标识保存这两个版本号,使大多数操作都不用加锁。它不足之处是每行记录都需要额外的存储空间,需要做更多的行检查工作和一些额外的维护工作。

MySQL 事务实现原理是什么?

事务的实现是基于数据库的存储引擎,不同的存储引擎对事务的支持程度不一样。MySQL 中支持事务的存储引擎有InnoDB 和 NDB。 InnoDB 是高版本 MySQL 的默认的存储引擎,因此就以 InnoDB 的事务实现为例,InnoDB 是通过多版本并发控制(MVCC,Multiversion Concurrency Control )解决不可重复读问题,加上间隙锁(也就是并发控制)解决幻读问题。因此 InnoDB 的 RR 隔离级别其实实现了串行化级别的效果,而且保留了比较好的并发性能。事务的隔离性是通过锁实现,而事务的原子性、一致性和持久性则是通过事务日志实现。

如何设置 MySQL 的事务隔离级别?

MySQL 事务隔离级别 MySQL.cnf 文件里设置的(默认目录 /etc/my.cnf),在文件的文末添加配置:

transaction-isolation = REPEATABLE-READ

可用的配置值:READ-UNCOMMITTED、READ-COMMITTED、REPEATABLE-READ、SERIALIZABLE。

InnoDB 默认的事务隔离级别是什么?如何修改?

InnoDB 默认的事务隔离是 repetable read(可重复读);可以通过 set 作用域 transaction isolation level 事务隔离级别 来修改事务的隔离级别,比如:

MySQL> set global transaction isolation level read committed; // 设置全局事务隔离级别为 read committed
MySQL> set session transaction isolation level read committed; // 设置当前会话事务隔离级别为 read committed

InnoDB 如何开启手动提交事务?

InnoDB 默认是自动提交事务的,每一次 SQL 操作(非 select 操作)都会自动提交一个事务,如果要手动开启事务需要设置 set autocommit=0 禁止自动提交事务,相当于开启手动提交事务。

在 InnoDB 中设置了 autocommit=0,添加一条信息之后没有手动执行提交操作,请问这条信息可以被查到吗?

autocommit=0 表示禁止自动事务提交,在添加操作之后没有进行手动提交,默认情况下其他连接客户端是查询不到此条新增数据的。

如何手动操作事务?

使用 begin 开启事务;rollback 回滚事务;commit 提交事务。具体使用示例如下:

begin;
insert person(uname,age) values('laowang',18);
rollback;
commit;

限时福利

加入作者群,与大佬面对面交流,同时还能获得最新面试经验。 赶紧添加小助手「xiangcode」,发送暗号「6000」即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/545557.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构pta选择判断复习

第一章绪论 1-3数据的逻辑结构是指数据的各数据项之间的逻辑关系。 错 是数据元素之间的逻辑关系 2-4以下属于逻辑结构的是( )。 (2分) 顺序表 散列表 有序表 单链表 有序表 2-12以下关于数据结构的说法中正确的是____。 (2分) A数据结构的逻辑结构独立于…

php删除数组中的空元素_PHP | 从数组中删除所有出现的元素

php删除数组中的空元素Given an array and we have to remove all occurrences of an element from it. 给定一个数组,我们必须从中删除所有出现的元素。 array_diff()函数 (array_diff() function) To remove all occurrences of an element or multiple elements…

粗略的看JFinal的基于AOP的拦截器的实现

2019独角兽企业重金招聘Python工程师标准>>> 简单的说一下AOP的实现,所谓AOP,即(Aspect Oriented Programming)的缩写,体现在程序中就是你可以通过配置在任意的代码块前后插入你想插入的执行代码。例如日志…

MySQL 索引的面试题总结

什么是索引? 索引是一种能帮助 MySQL 提高查询效率的数据结构。 索引分别有哪些优点和缺点? 索引的优点如下: 快速访问数据表中的特定信息,提高检索速度。创建唯一性索引,保证数据表中每一行数据的唯一性。加速表与表之间的连接。使用分组和排序进行数据检索时,可以显…

大二上数据结构复习

目录 第一章绪论练习 第二章线性表 第三章栈和队列 第四章串 第五章数组和广义表 第六章树和二叉树 第七章图 第九章查找 第十章排序 第一章绪论练习 1-8 数据结构的抽象操作的定义与具体实现有关。 (1分) T F 1-14 数据结构包括数据对象集以及它们的逻辑结构和物理结构&#…

MD5算法实现

什么是MD5???---MD5的全称是Message-Digest Algorithm 5 MD5的典型应用是对一段信息(Message)产生信息摘要(Message-Digest),以防止被篡改。比如&…

Oracle plsqlI 练习 传值

--根据人名查个人薪水和本部门平均薪水--select语句实现select a.deptno "部门编号",a.dname "部门名称",a.ename "姓名",a.sal "薪水",b.avg_sal "部门平均薪水"from (select d.deptno, d.dname, e.ename, sal n…

Java StringBuilder codePointBefore()方法与示例

StringBuilder类codePointBefore()方法 (StringBuilder Class codePointBefore() method) codePointBefore() method is available in java.lang package. codePointBefore()方法在java.lang包中可用。 codePointBefore() method is used to represent the Unicode code point …

MySQL 中锁的面试题总结

什么是锁?MySQL 中提供了几类锁? 锁是实现数据库并发控制的重要手段,可以保证数据库在多人同时操作时能够正常运行。MySQL 提供了全局锁、行级锁、表级锁。其中 InnoDB 支持表级锁和行级锁,MyISAM 只支持表级锁。 什么是死锁? 是指两个或两个以上的进程在执行过程中,因…

Oracle-(if/case/以及模拟注册登录)练习-20131015

--作业--1、 输入部门编号,按照下列加薪比例执行(用if-elsif 和case两种方法实现)。--deptno raise(%)--10 5%--20 10%--30 15%--40 20%--加薪比例以现有的sal为标准--方法一select deptno,ename,sal,(case deptnowhen 10 then sal * 0…

大二上数据结构复习2

第二章线性表 综合 一、在什么情况下用顺序表比用链表好 表长度确定,很少进行插入删除操作且经常访问元素 二、2-4 顺序表的插入和删除要求仍然保持各个元素原来的次序。设在等概率情形下, 对有 127 个元素的顺序表进行插入, 平均需要移动多少个元素? 删除一个元素…

Java SimpleTimeZone inDaylightTime()方法及示例

SimpleTimeZone类inDaylightTime()方法 (SimpleTimeZone Class inDaylightTime() method) inDaylightTime() method is available in java.util package. inDaylightTime()方法在java.util包中可用。 inDaylightTime() method is used to check whether the given date (d) is …

MySQL 命令和内置函数

如何用命令行方式连接 MySQL 数据库? 使用 mysql -u用户名 -p密码; 输入用户名和密码就可以正常进入数据库连接了,实例如下: mysql -uroot -p123456; 其中,用户名为 root,密码为 123456。 关于命令 mysql -h 127.0.0.1 -uroot -P 3307 -p3307 以下说法错误的是? A.-h …

Oracle plsql 月历

declarev_year number : 2013;v_month number : &input_month;v_day number;v_lastday number;begindbms_output.put_line(v_year || 年 || v_month || 月的月历);--转换星期为数字,方便计算case substr(to_char(to_date(v_year || v_month,yyyymm),day),3,1)wh…

Java GregorianCalendar setTimeZone()方法与示例

GregorianCalendar类setTimeZone()方法 (GregorianCalendar Class setTimeZone() method) setTimeZone() method is available in java.util package. setTimeZone()方法在java.util包中可用。 setTimeZone() method is used to sets the time zone with the specified TimeZon…

操作系统(王道笔记第二章)

目录第二章 2.1_1进程的定义、组成、组成形式、特征 2.1_2进程的状态与转换 2.1_3进程的控制 2.1_4进程通信 2.1_5线程概念和多线程模型 2.2_1处理机调度的概念层次 2.2_2处理机调度的时机、切换与过程、方式 2.2_3调度算法的评价指标 2.2_4FCFS、SJF、HRRN调度算法 2.2_5时间片…

MySQL 中日志的面试题总结

MySQL 有哪些重要的日志文件? MySQL 中的重要日志分为以下几个: ① 错误日志:用来记录 MySQL 服务器运行过程中的错误信息,比如,无法加载 MySQL 数据库的数据文件,或权限不正确等都会被记录在此,还有复制环境下,从服务器进程的信息也会被记录进错误日志。默认情况下,…

centos不能挂在ntfs

roots 下载]# mount /dev/sdb1 /mnt mount: unknown filesystem type ntfs wget http://www.tuxera.com/community/ntfs-3g-download/ http://tuxera.com/opensource/ntfs-3g_ntfsprogs-2014.2.15.tgz 下载,安装 ./configure make make install 用法: mo…

Oracle 练习题 20131017

--2013-10-17 练习题--1、输入一个年份,判断其是不是闰年,并做相应的提示。--方法一:正常算declarev_year number : 1900;beginif mod(v_year,100) 0 thenif mod(v_year,400) 0 thendbms_output.put_line(v_year || 是闰年);elsedbms_outpu…

Java类类getDeclaredMethod()方法及示例

类的类getDeclaredMethod()方法 (Class class getDeclaredMethod() method) getDeclaredMethod() method is available in java.lang package. getDeclaredMethod()方法在java.lang包中可用。 getDeclaredMethod() method is used to return Method objects that indicate the …