事务Transaction
一个事务是一个完整的业务逻辑,不可再分。
事务的存在是为保证数据的完整性。
比如:银行转账,从A账户到B账户转账10000,需要执行两条update语句
update t_act set balance = balance - 1000 where actno = 'act-001' ;
update t_act set balance = balance + 1000 where actno = 'act-002';
这两条语句必须同时成功。
要想保证以上两条DML同时成功或者失败,需要使用数据库中的"事务机制"。
注意:只有DML语句支持事务。(只有insert、delete、update)
TCL(事务):
提交事务:commit
回滚事务:rollback
保持点:savepoint
事务特性
四大特性:ACID
A:原则性:事务是最小的工作单位,不可再分。
C:一致性:事务必须保持多条DML语句同时成功或者失败。
I:隔离性:事务A与事务B之间具有隔离。(具有隔离级别)
D:持久性:最终数据必须持久化到硬盘文件,事务才算成功。
I:事务隔离性
事务隔离存在隔离级别,理论上包括4个。
第一级别:读未提交(read uncommitted)
对方事务还没有提交,我们当前事务可以读取对方未提交的数据。
读未提交的数据存在脏读(Dirty Read)现象:表示读到了脏的数据。
第二级别:读已提交(read committed)
对方事务提交之后的数据我方可以读到。
读已经提交存在的问题是:不可重复读。
第三级别:可重复读(repeatable read)
这种隔离解决了不可重复读的问题。
问题:读取到的数据是幻像。
第四级别:序列化读/串型化读(serializable)
解决了,所有问题。
效率低,需要排队。
演示事务
mysql事务是自动提交的。(执行一条DML语句就执行一次)
开启事务:start transaction;
使用rollback、commit来结束事务。
commit会直接将数据提交,而使用rollback会回到事务开始的状态。
使用savepoint 名字
来记录保存点,使用rollback 保存点名字
会返回到对应保存时候的位置。
设置全局事务的隔离级别set global transaction isolation level 隔离级别
第一级别read uncommitted
第二级别read committed
第三级别repeatable read
第四级别serializable
查看隔离级别
mysql8:select @@global.transaction_isolation
mysql5:select @@global.tx_isolation
索引
什么时候考虑给字段添加索引?
1.数据量庞大。(根据客户的要求,线上的环境)
2.该字段很少的DML操作。(因为字段进行修改时,索引也需要维护)
3.该字段经常出现在where中。
注意:主键和具有unique约束的字段会自动添加索引。
主键查询效率高。
查看sql语句的执行计划
explain SQL语句;
explain select ename,sal from emp where sal = 5000;
给sal字段添加索引:
create index emp_sal_index on emp(sal);
create index 索引名字 on 表名(字段);
drop index emp_sal_index on emp;
drop index 索引名称 on 表名;
索引底层采样的数据结构:B + Tree
单一索引:给单个字段添加索引
复合索引:给多个字段联合起来添加一个索引
主键索引:主键上会自动添加索引
唯一索引:有unique约束的字段上会自动添加索引。
。。。
视图
一些数据库为了保护数据安全性,会采用视图。
create view 视图名字 as DQL语句;
可以看做是从一个表中独立出来的数据,可以通过视图对其增删改查。
DBA命令
1.将数据库中的数据导出。
mysqldump 数据库名字>路径.sql -uroot -p密码
(导出数据库)
mysqldump 数据库名字 表名>路径.sql -uroot -p密码
(导出数据库中的指定表)
这条语句不要登录,直接在dos窗口中执行。
2.导入数据。
使用source命令导入数据
登录后,创建一个数据库,use
使用
使用source 路径.sql文件
注意:这条语句不用加分号。
数据设计三范式
什么设计范式?
设计表的依据。按照这个三范式是设计的表不会出现数据冗余。
三范式都是哪些?
第一范式:任何一张表都有一个主键。
第二方式:建立在第一范式的基础之上,所以非主键字段完全依赖主键,不能产生部分依赖。(多对多三张表,俩个外键关系表)
第三范式:建立在第二范式之上,所有非主键直接依赖主键,不能产生传递依赖。
(一对多?两张表,多的表加外键)
在实际的开发中,我们会以客服的需求为主,会拿冗余换执行速度。