1、事务是什么,以及事务的四大特性?
事务的概念:
1.事务是访问并可能更新数据库中各项数据的一个执行单元。
2.事务是一个不可分割的数据库操作序列,也是数据库并发控制的基本单位。
3.事务的执行结果必须使数据库从一种一致性状态变为另一种一致性的状态。
事务的生命周期:
由事务开始和事务结束构成。
事务的四大特性:
1、原子性:事务是一个不可分割的工作单位,整个事务中的所有操作要么全部提交成功,要么全部失败回滚。
2、一致性:事务执行前后数据库的完整性必须保持一致。
3、隔离性:事务的执行不能有其他事务的干扰,事务的内部操作和使用数据对其他的并发事务是隔离的,互不干扰。
4、持久性:事务一旦提交。对数据库的改变就是永久的。
事务的应用:执行多条SQL语句
public bool ACID(string[] strStudentNoScore) {
//打开数据库连接
sqlcon.Open();
//声明sql事务
SqlTransaction myTrans;
//sql命令对象
SqlCommand mycmd = new SqlCommand();
//声明命令对象的连接数据库
mycmd.Connection = sqlcon;
//开启事务
myTrans = sqlcon.BeginTransaction();
//设置将在命令对象中执行的事务
mycmd.Transaction = myTrans;
try
{
//遍历字符串数组中的sql语句
for (int i = 0; i < strStudentNoScore.Length; i++)
{
mycmd.CommandText = strStudentNoScore[i];
int r =mycmd.ExecuteNonQuery();
}
//事务提交
myTrans.Commit();
return true;
}
catch (Exception)
{
//执行错误,事务回滚
if (myTrans != null)
myTrans.Rollback();
return false;
}
finally
{
//关闭连接
if (sqlcon != null)
sqlcon.Close();
}
}
2、事务的隔离级别有哪些,MySQL默认是哪个?
事务的隔离级别是为了处理数据读取方面碰到的问题:即脏读、不可重复读、幻读。
脏读:一个事务读到了另一个事务正在处理且未提交的数据后,产生未提交的数据依赖现象。
不可重复读:数据库访问中,一个事务进行多次相同的查询,却返回不同的数据。
幻读:同一个事务中进行多次查询,却返回不同的结果集。
不可重复读对应的是Update操作,幻读对应的是Insert操作。幻读是不可重复读的一种特殊场景。
数据库事务的隔离级别从高到低有4种,Read uncommitted 、Read committed 、Repeatable read 、Serializable。
读未提交:一个事务可以读取到另一个事务未提交的数据。
读提交:一个事务要等另一个事务提交后才能读取到数据。
重复度:在事务开启时,不再允许修改操作。
序列化:事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。
Mysql的默认隔离级别是Repeatable read。
3、内连接与左外连接的区别?
内连接:inner join(等值连接) 只返回两个表中联结字段相等的数据。
左外连接也称左连接。以左表为基表,在FROM子句中使用关键字“LEFT OUTER JOIN”或关键字“LEFT JOIN”来连接俩张表。
1.内连接就是取交集的部分。
2.左连接就是左表全部的数据加上交集的数据。
4、InnoDB与MyISAM的区别?
一、InnoDB
二、MyISAM
总结:
5、Mybatis分页插件的原理?
6、MySQL建表时注意什么?
7、如何查看MySQL的执行计划?
方法一、使用explain执行下面语句:
explain select * from t_user;
方法二、使用图形化界面(Navicat)解释器
结果:
分析执行计划,重点关注id, type, key, rows, extra信息。id查看表加载顺序,type查看索引类型,key查看使用的具体索引,rows关注查找结果所需遍历的数据量大不大,extra关注其他一些影响性能的关键信息。
8、索引失效的情况?
1) 没有查询条件,或者查询条件没有建立索引
2) 在查询条件上没有使用引导列
3) 查询的数量是大表的大部分,应该是30%以上。
4) 索引本身失效
5) 查询条件使用函数在索引列上,或者 对索引列进行运算, 运算包括(+,-,*,/,! 等) 错误的例子:select * from test where id-1=9; 正确的例子:select * from test where id=10;
6) 对小表查询
7) 提示不使用索引
8) 统计数据不真实
9)like "%_" 百分号在前.
9、什么是回表查询?
1.首先得知道Mysql 的 InnoDB引擎的索引结构即 B+树
B+ 树 索引主要分为两个:聚簇索引 和 非聚簇索引
我们如果使用主键查找,那么使用的是聚簇索引,能直接获取到数据,而如果我们使用非聚簇索引查找,如果该索引不包含我们需要查找的的全部字段,那么就需要根据叶子节点存储的主键值在进行一次查找来找到我们需要的数据,这就是回表查询。
2.回表查询需要二次查询,那么效率肯定就会低,那么为了解决这个问题,我们可以使用覆盖索引
如果一个索引包含(或者说覆盖)所有需要查询的字段的值,我们就称之为“覆盖索引”。
如主键索引,如果一条 SQL 需要查询主键,那么正好根据主键索引就可以查到主键。
再如普通索引,如果一条 SQL 需要查询 name,name 字段正好有索引, 那么直接根据这个索引就可以查到数据,也无需回表。