面试题首页 > 数据库面试题

数据库事务面试题

001事务的概念?

事务是逻辑上的一组操作,要么都执行,要么都不执行。事务最经典的例子就是转账了。假如小明要给小红转账1000元,这个转账会涉及到两个关键操作就是:将小明的余额减少1000元,将小红的余额增加1000元。万一在这两个操作之间突然出现错误比如银行系统崩溃,导致小明余额减少而小红的余额没有增加,这样就不对了。事务就是保证这两个关键操作要么都成功,要么都要失败。

002事务的特征?

数据库事务transanction正确执行的四个基本要素。ACID,原子性(Atomicity)、一致性(Correspondence)、隔离性(Isolation)、持久性(Durability)。
● 原子性:事务是最小的执行单位,不允许分割。整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。
● 一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。
● 隔离性:并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;
● 持久性:在事务完成以后,该事务对数据库中数据的改变是持久的。即使数据库发生故障也不应该对其有任何影响。

003事务的隔离级别?

数据库的隔离级别越高,并发性就越差,性能就越低。
oracle的隔离级别默认是READ COMMITED
mysql的隔离级别默认是REPEATABLE READ,mysql下的事务默认是自动提交的。

读未提交:事务A在事务B未提交前读取数据,如果事务B撤销了修改,那么A会读取到脏数据。因为事务B提交前的数据在缓存中
读已提交:事务A分别在事务B提交前和提交后读取数据,出现不可重复读。因为事务B提交前的数据在缓存,事务B提交后的数据在硬盘,而事务A一直读取的都是硬盘的数据从而导致不能够重复读的问题。
可重复读:事务A在事务B添加一条数据提交后,事务A读取记录数的时候不一致出现幻读。不可重复读的重点在于Update和Delete,而幻读在于Insert。

004并发事务带来的问题?

在典型的应用程序中,如果多个事务并发运行可能会导致以下的问题。

在不同的隔离级别下,V值分别如下:

  读未提交  读已提交  可重复读  串行化
V1 2 1 1 1
V2 2 2 1 1
V3 2 2 2 2

与标准的SQL隔离级别不同的是,InnoDB在可重复读级别下,利用Next-Key Lock解决了幻读问题,能够完全保证事务的隔离性,达到了串行化级别。

005索引的优缺点,什么时候使用索引,什么时候不能使用索引

索引最大的好处是提高查询速度, 
缺点是更新数据时效率低,因为要同时更新索引 
对数据进行频繁查询进建立索引,如果要频繁更改数据不建议使用索引。

006简述什么是聚簇索引与非聚簇索引?

聚簇索引:将数据存储与索引放到了一块,找到索引也就找到了数据。
非聚簇索引:将数据存储于索引分开结构,索引结构的叶子节点指向了数据的对应行,MyISAM通过key_buffer把索引先缓存到内存中,当需要访问数据时(通过索引访问数据),在内存中直接搜索索引,然后通过索引找到磁盘相应数据,这也就是为什么索引不在key buffer命中时,速度慢的原因。

007主键索引是聚集索引还是非聚集索引?

1.聚集索引决定了数据库的物理存储结构,而主键只是确定表格逻辑组织方式。这两者不可混淆!
2.在InnoDB下主键索引是聚集索引,在MyISAM下主键索引是非聚集索引。

008存储过程和函数的区别?

存储过程是用户定义的一系列sql语句的集合,涉及特定表或其它对象的任务,用户可以调用存储过程,而函数通常是数据库已定义的方法,它接收参数并返回某种类型的值并且不涉及特定用户表。

009什么是存储过程?有哪些优缺点?

存储过程,就是一些编译好了的SQL语句,这些SQL语句代码像一个方法一样实现一些功能(对单表或多表的增删改查),然后给这些代码块取一个名字,在用到这个功能的时候调用即可。
优点:存储过程是一个预编译的代码块,执行效率比较高;存储过程在服务器端运行,减少客户端的压力;允许模块化程序设计,只需要创建一次过程,以后在程序中就可以调用该过程任意次,类似方法的复用;一个存储过程替代大量T_SQL语句 ,可以降低网络通信量,提高通信速率;可以一定程度上确保数据安全。
缺点:调试麻烦、可移植性不灵活、重新编译问题.

010什么是触发器?触发器的使用场景有哪些?

1)触发器,指一段代码,当触发某个事件时,自动执行这些代码。
2)使用场景:可以通过数据库中的相关表实现级联更改;实时监控某张表中的某个字段的更改而需要做出相应的处理。

011什么叫视图?

视图是一种虚拟的表,具有和物理表相同的功能。可以对视图进行增,改,查,操作,视图通常是有一个表或者多个表的行或列的子集。对视图的修改不影响基本表。它使得我们获取数据更容易,相比多表查询。

012什么是游标?

游标:是对查询出来的结果集作为一个单元来有效的处理。游标可以定在该单元中的特定行,从结果集的当前行检索一行或多行。可以对结果集当前行做修改。一般不使用游标,但是需要逐条处理数据的时候,游标显得十分重要。

013视图的作用?以及视图可以更新数据吗?

1)使用视图可以简化复杂的sql操作,隐藏具体的细节,保护数据;
2)视图不能被索引,也不能有关联的触发器或默认值,如果视图本身内有order by则对视图再次order by将被覆盖。对于某些视图,例如,未使用联结子查询分组聚集函数Distinct Union等,是可以对其更新的,对视图的更新将对基表进行更新;但是视图主要用于简化检索,保护数据,并不用于更新,而且大部分视图都不可以更新。

014什么是数据库连接池?为什么需要数据库连接池呢?

数据库连接是一种关键的有限的昂贵的资源,对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序 的性能指标。数据库连接池正是针对这个问题提出来的。
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。
数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数来设定的。无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了 这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。

目录

返回顶部