一,事物
1.事务概念
事务(Transaction),是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。
2.事务基本原理
基本原理:mysql允许将事务统一进行管理(存储引擎innodb),将用户所作的操作暂时保存起来不直接放到数据表中(更新),等到用户确认结果之后再进行操作。
事务在mysql通常是自动提交,但是也可以使用手动提交。
事务特性(4种):
原子性 (atomicity):强调事务的不可分割.操作这些指令时,要么全部执行成功,要么全部不执行,只要其中一个指令执行失败,所有的执行都执行失败,数据进行回滚,回到执行指令前的数据状态。
一致性 (consistency):事务的执行的前后数据的完整性保持一致.
隔离性 (isolation):一个事务执行的过程中,不应该受到其他事务的干扰。比如操作同一张表是,数据库为每个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。要达到这么一种效果,对于任意两个并发的事务t1和t2,在事务t1看来,t2要么在t1开始之前就已经结束了,要么在t1结束之后再开始,这样每个事务都干净,没有其他事务在并发的执行。
持久性(durability) :事务一旦结束,数据就持久到数据库,他对于数据的改变是永久性。
3.自动事务
自动事务:auto commit 当客户端发送一条sql指令(写操作:增、删、改)给服务器的时候,服务器在执行之后,不用等待用户反馈结果,会自动将记过同步到数据库。
证明:利用两个客户端访问同一个数据库,一个客户端执行sql指令,另一个查看结果
关闭自动事务:关闭之后,系统将不会帮助用户自动提交结果
set autocommit=off;
-- 客户端关闭了自动事务
-- 插入数据:
insert into my_class VALUES (110,'警察班');
select * from my_class;
在 2客户端上查询不到结果,在 1客户端上可以查询,虽然没有同步,但是系统会自动根据事务日志中,查询到已经修改后的表的数据,加工过的。
一旦自动事务关闭,需要用户提供是否同步的命令。
Commit 提交 ,同步到数据表,事务日志就被清空了。
Roll back 回滚 清空之前操作,事务日志也被清空。
通常不会关闭自动事务,太麻烦了,因此在需要使用特殊事务处理的时候才会进行手动事务。
insert into my_class VALUES (110,'警察班');
select * from my_class;
commit;
insert into my_class VALUES (120,'医生班');
ROLLBACK;
4.手动事务
手动事务:不管是开始还是过程还是结束,都需要用户(程序员)手动发送事务操作指令来实现。
手动事务对应的命令:
- start transaction :开启事务,从这条语句开始,后面的所有语句都不会直接写入到数据表,保存到事务日志中
- 事务处理:多个些的指令
- 事务提交:commit 提交 rollback 回滚 到这个时候所有的事物才会结束,要么全部写入,要么全部清空。
开启事务
Start transaction
执行事务
将多个连续的但是是一个整体的sql指令逐一执行
事务操作:
-- 新增数据
insert into my_class VALUES (120,'医生班');
-- 修改数据
update my_student set class_id=120 where stu_name='rose';
提交事务
确认提交:commit
归滚操作:rollback
start TRANSACTION;
insert into my_class VALUES (120,'医生班');
update my_student set class_id=120 where stu_name='rose';
ROLLBACK;
5.回滚点
回滚点:save point 当系统有一系列事务操作时,其中的部分步骤如果成功了,没有必要全部重新来过,可以在某个点设计一个记号,回滚点,然后后面如果失败了,那么可以回到这个标记记号的位置。
增加回滚点:save point 回滚点名字 //字母 数字和下划线构成
回滚到回滚点:rollback to 回滚点名字 //回滚之后的操作就没有了失效了
如果有多个步骤,可以设置多个回滚点,但是如果回到了最前面的回滚点,后面的回滚点就失效了。
start TRANSACTION; //再次开启事务
insert into my_class VALUES (119,'火警班'); //插入数据
SAVEPOINT sp1; //增加回滚点
update my_student set class_id=119 where stu_id='9999999'; //出现错误步骤 修改错了
ROLLBACK to sp1; //回滚到回滚点
commit; //提交
二,索引
1.索引意义
Mysql索引的建立对于mysql的高效运行是很重要的,索引可以大大提高mysql的检索效率。
拿汉语字典的目录打比方,我们可以 按照拼音、笔画、偏旁部首等排序的目录(索引)快速的找到需要的字。
索引是应用在sql查询语句的条件,一般为where子句的条件。
2.索引分类
单列索引:即一个索引只包含单个列,一个表可以有多个单列索引。
普通索引:mysql中的基本索引类型,没有什么限制,允许在定义索引的列中插入重复的值和空值,纯粹的为了查询数据更快。
唯一索引:索引列的值必须是唯一的,但是允许为null
主键索引:是一种特殊的唯一 索引,不允许值为null
组合索引(了解):即一个索引包含多个列
3.索引的操作
创建索引
语法:create index 索引名 on 表名 (字段名 数据类型)
create UNIQUE index aa on my_student(stu_name);
查看索引
show index from my_student;
修改索引
Alter table 表名 add (索引名) (字段名 数据类型)
删除索引
Drop index 索引名 on 表名;
三,视图
1.创建视图
视图的本质是sql指令(select语句)
基本语法:create view 视图名字 as select 指令; //可以是单表数据也可以是连接查询联合查询或者是子查询
查看视图结构,视图本身是虚拟表,所以一般关于表的操作都适用于视图。
create view student_class_v as
select s.*,c.class_name from my_student s LEFT join my_class c
on s.class_id=c.class_id;
注意:连接查询的时候避免重复字段
create view student_class_v as
select s.*,c.class_name from my_student s LEFT join my_class c
on s.class_id=c.class_id;
select * from student_class_v;
select stu_name,class_name from student_class_v;
2.使用视图
视图是一张虚拟表,可以直接把视图看作表来操作,但是视图本身没有数据,是临时执行select语句得到的对应结果,主要用于查询操作。
基本语法:select 字段列表 from 视图名字 各种子句;
3.修改视图
本质是修改视图对应的查询语句
基本语法:alter view 视图名字 as select 指令;
4.删除视图
基本语法:drop view 视图名字;