面试用,转自:https://www.cnblogs.com/fjdingsd/p/5273008.html
1.ACID
A:原子性:原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。
C:一致性:一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。
I:隔离性:是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。
D:持久性:是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。例如我们在使用JDBC操作数据库时,在提交事务方法后,提示用户事务操作完成,当我们程序执行完成直到看到提示后,就可以认定事务以及正确提交,即使这时候数据库出现了问题,也必须要将我们的事务完全执行完成,否则就会造成我们看到提示事务处理完毕,但是数据库因为故障而没有执行事务的重大错误。
2.隔离性级别:
1.脏读:
脏读是指在一个事务处理过程里读取了另一个未提交的事务中的数据。
当一个事务正在多次修改某个数据,而在这个事务中这多次的修改都还未提交,这时一个并发的事务来访问该数据,就会造成两个事务得到的数据不一致。例如:用户A向用户B转账100元,对应SQL命令如下
update account set money=money+100 where name=’B’; (此时A通知B) update account set money=money - 100 where name=’A’;
2.不可重复读:
不可重复读是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。
例如事务T1在读取某一数据,而事务T2立马修改了这个数据并且提交事务给数据库,事务T1再次读取该数据就得到了不同的结果,发送了不可重复读。
不可重复读和脏读的区别是,脏读是某一事务读取了另一个事务未提交的脏数据,而不可重复读则是读取了前一事务提交的数据。
在某些情况下,不可重复读并不是问题,比如我们多次查询某个数据当然以最后查询得到的结果为主。但在另一些情况下就有可能发生问题,例如对于同一个数据A和B依次查询就可能不同,A和B就可能打起来了……
3.虚读:
幻读是事务非独立执行时发生的一种现象。例如事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读。
幻读和不可重复读都是读取了另一条已经提交的事务(这点就脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)。
MySQL数据库为我们提供的四种隔离级别:
① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
② Repeatable read (可重复读):可避免脏读、不可重复读的发生。
③ Read committed (读已提交):可避免脏读的发生。
④ Read uncommitted (读未提交):最低级别,任何情况都无法保证。
3.触发器
https://www.cnblogs.com/yank/p/4193820.html
/感觉这个考到的可能性不大,
在实际应用中触发器主要是进行建立约束及级联更新。主要是DML触发器,在select,update,delete这些语句被执行的时候。
//感觉没有什么好写的,都是一些很平常的东西,主要就是sql怎么写吧。
给出了几个例子:在插入一行时有约束条件;在更改时进行级联更改。
4.索引的作用?优缺点?
唯一、不为空、经常被查询的字段应该作为索引。
索引相当于目录,加快查询的速度,可以对一列或者多列建立索引,
索引是使用B+树来实现的。
下面来介绍一下B+树来加深理解:
B+树中非叶节点包括数据项和指针,非叶节点的数据项并存储数据,只是用来索引,真正的数据存在于叶节点当中。每一个节点代表一个磁盘块。
5.什么是事务?
与SQL语句执行相关。是操作的基本单位,可以由一条或者多条sql语句组成。有ACID特性。
锁就是为了保证事务的完整性和并发性。
共享锁和排他锁。读取的时候添加共享锁,要修改数据的时候会添加排他锁。
可能会产生死锁,当两个事务都对一个表加共享锁,并且都想升级为排他锁的时候,会互相等待对方释放共享锁,从而导致死锁。
6.什么是视图?游标是什么?
①是SQL语句的查询结果,具有表的结构,但是不实现存储;
②字段来自数据库中一张表或者多张表;数据保持和数据库中的一致。
对单表视图一般用于查询和修改;对多表视图一般就查询,很难修改;
作用:①对经常使用的数据定义为视图
②为了数据的安全性,用户只能查询和更改可以看到的数据
7.数据库三范式
转自:https://blog.csdn.net/qq_33862644/article/details/79692652
1NF:每一列必须是不可分割的最小单元,确保每一列的原子性。比如地址和电话不能放在同一列,应该形成两列。
2NF:要求表中所有列必须依赖于主键,也就是说一张表只能描述一件事情。比如同一张表中同时出现产品信息和订单信息(存在部分函数依赖),而应该拆分为两个表。
所有非关键字段都完全依赖于任意一组候选关键字。也就是不存在非关键字被部分候选关键字所决定。(这个部分修饰的是关键字)
3NF:表中的每一列都直接与主键相关,而不能是间接相关,用外键做表的关联(不存在非关键字对关键字的传递依赖)。比如订单表中要保存客户id,那么客户姓名不能存进来,因为客户姓名是依赖于客户id,而不是订单id。
BCNF:比如(仓库名,管理员名,物品名,数量)(3NF)这里仓库名函数依赖于(管理员名和物品名),主属性对码的部分函数依赖,所以应该将表拆分。
8.函数依赖
关系模式的两个属性子集X和Y,如果X能够唯一确定Y的值,那么就是Y函数依赖于X。
9.