网站首页图片 代码,销售管理怎么带团队,wordpress能做app吗,网站建设平台哪个公司好1.事务
1.一个事务其实就是一个完整的业务逻辑
如#xff1a;转账#xff0c;从A账户向B账户转账10000#xff0c;将A账户的钱减去10000#xff08;update#xff09;#xff0c;将B账户的钱加上10000#xff08;update#xff09;#xff0c;这就是一个完整的业务逻…1.事务
1.一个事务其实就是一个完整的业务逻辑
如转账从A账户向B账户转账10000将A账户的钱减去10000update将B账户的钱加上10000update这就是一个完整的业务逻辑
以上操作是一个最小的工作单元要么同时成功要么同时失败不可再分
只有DML语句才会有事务insertdeleteupdate因为这些语句是数据库表中数据进行增删改的只要一旦涉及增删改一定要考虑安全问题 2.对事务的理解
假设所有业务只要一条DML语句就能完成还有必要存在事务机制吗
不必要没有存在的价值正是做某件事需要多条DML语句联合才能完成所以需要事务的存在
说到底一个事务其实就是多条DML语句同时成功或同时失败 3.事务如何实现批量DML语句同时成功或失败
InnoDB存储引擎提供一组用来记录事务性活动的日志文件
事务开启
insert
delete
update
update
....
事务结束
在事务执行过程中每一条DML的操作都会记录到’事务性活动的日志文件‘中在这个过程中可以提交事务也可以回滚事务
提交事务
清空事务性活动的日志文件将数据全部彻底持久化到数据库表中提交事务标志着事务的结束且是一种全部成功的结束
回滚事务
将之前所有的DML操作全部撤销且清空事务性活动的日志文件标志着事务的结束且是一种全部失败的结束 4.怎么提交事务怎么回滚事务
提交事务commit;
回滚事务rollback;只能回滚到上一次的提交点
事务对应的英文transaction
在MySQL默认的事务行为
默认情况下支持自动提交事务每执行一条DML语句则提交一次
自动提交不符合开发习惯因为一个业务通常需要多条DML语句共同执行为了保证数据的安全必须要求同时成功之后再提交所以不能执行一条就提交一次
将MySQL自动提交机制关闭
start transaction;开启事务
演示事务
start transaction;
insert into dept_bak values(10,abc,aa);
insert into dept_bak values(10,abc,bb);
select * from dept_bak;//有数据
rollback;
select * from dept_bak;//Empty 5.事务的四个特性
原子性说明事务是最小的工作单元不可再分
一致性在同一个事务中所有操作必须同时成功或同时失败保证数据一致性
隔离性A事务和B事务之间具有一定隔离。
持久性事务最终结束的一个保障事务提交就相当于将没有保存到硬盘上的数据保存到硬盘上 6.隔离级别
A教室和B教室中有一道墙可以很厚也可以很薄这就是事务的隔离级别
4个隔离级别
读未提交read uncommitted最低隔离级别《没有提交就读到》 事务A可以读取到事务B未提交的数据存在脏读Dirty read现象即读到了脏数据
这种隔离级别一般都是理论上的大多数数据库隔离级别都是二档起步
读已提交read committed《提交后读到》 事务A只能读取到事务B提交之后的数据解决了脏读现象存在不可重复读取数据问题
这种隔离级别是比较真实的数据每一次读到的数据绝对真实Oracle数据库默认的隔离级别 不可重复读取数据 在事务开启后第一次读到的数据是3条当前事务还没有结束可能第二次再读取时读到的数据是4条称为不可重复读取
可重复读repeatable read《提交后也读不到》 事务A开启之后每一次在事务A中读取到的数据都是一致的。即使事务B将数据已经修改且提交事务A读取到的数据还是没发生改变解决了不可重复读的问题存在了幻影读问题每一次读取的数据都是幻象不够真实永远读取的都是刚开启事务时的数据。MySQL默认的隔离级别
序列化/串行化serializable最高隔离级别
最高隔离级别效率最低解决了所有问题
这种隔离级别表示事务排队不能并发 7.演示各种隔离级别
查看隔离级别select tx_isolation
1.演示read uncommitted
set global transaction isolation level read uncommitted;设置全局隔离级别为读未提交
事务A
start transaction;
select * from t_user;//能查询到事务B未提交数据
事务B
start transaction;
insert into t_user values(zhangsan);//未提交 2.演示read committed
set global transaction isolation level read committed;
事务A
start transaction;
select * from t_user;//不能查询到
select * from t_user;//commit后能查询到
事务B
start transaction;
insert into t_user values(zhangsan);//未提交
commit//提交 3.演示repeatable read
set global transaction isolation level repeatable read
事务A
start transaction;
select * from t_user;//不能查询到
select * from t_user;//commit后也不能查询到
事务B
start transaction;
insert into t_user values(zhangsan);//未提交
commit//提交 4.演示serializable
set global transaction isolation level serializable;
事务A
start transaction;
select * from t_user;//光标卡着不动等待另一个事务提交
select * from t_user;//提交后可查询到
事务B
start transaction;
insert into t_user values(zhangsan);//未提交
commit//提交 2.索引
索引index是在数据库表的字段上添加为了提高查询效率存在的一种机制一张表的一个字段可以添加一个索引多个字段联合起来也可以添加索引相当于一本书的目录为了缩小扫描范围而存在的一种机制
在MySQL数据库当中索引也需排序索引排序和TreeSet数据结构相同底层是一个自平衡二叉树在MySQL当中索引是一个B-Tree数据结构遵循左小右大原则采用中序遍历
索引是各种数据库进行优化的重要手段优化时优先考虑的因素就是索引 1.索引的实现原理
假设有一张用户表t_user
id(pk)name硬盘上物理存储编号100zhangsan0x1111120lisi0x222299wangwu0x8888130zhaoliu0x999955jack0x6666idIndex(id字段的索引对象) select * from t_user where id 130;
MySQL发现id字段上有索引对象会通过索引对象idIndex进行查找
通过索引对象定位到130得出物理编号0x9999此时SQL语句转换
select * from t_user where 物理编号 0x9999;
注1在任何数据库当中主键上都会自动添加索引对象即id字段上自动有索引在MySQL中一个字段上如果有unique约束也会自动创建索引对象
注2在任何数据库当中任何一张表的任何一条记录在硬盘存储上都有一个硬盘的物理存储编号
注3在MySQL中索引是一个单独的对象不同的存储引擎以不同形式存在。在MyISAM存储引擎中索引存储在一个.MYI文件中在InnoDB存储引擎中索引存储在tablespace中在MEMORY存储引擎中索引存储在内存里。
什么条件下会考虑给字段添加索引
1.数据量庞大
2.该字段经常出现在where后面以条件形式存在即这个字段总是被扫描
3.该字段很少DML增删改操作因为DML后索引需重新排序 2.索引的创建和删除
创建索引
create index emp_ename_index on emp(ename);
给emp表的ename字段添加索引起名emp_ename_index
删除索引
drop index emp_ename_index on emp;
将emp表上的emp_ename_index索引对象删除
查看一个SQL语句是否使用索引进行检索
explain select * from emp where ename Jack;
//typeALL,扫描了14条记录说明没有使用索引
create index emp_ename_index on emp(ename);
explain select * from emp where ename Jack;
//typeref,扫描了1条记录使用了索引 3.索引失效
失效1
select * from emp where ename like %T;
//即使添加了索引也不会走索引因为模糊匹配当中以%开头了应尽量避免模糊查询%开头
失效2
select * from emp where ename ‘jack’ or job manager;
//使用or要求两边条件字段都要有索引否则不走索引
失效3
creat index emp_job_sal_index on emp(job,sal);
select * from emp where job manager;//使用索引
select * from emp where sal 3000;//失效
//使用复合索引没有使用左侧的列查找索引失效
失效4
create index emp_sal_index on emp(sal);
select * from emp where sal1 3000;
//在where当中索引列参加了运算索引失效
失效5
select * from emp where lower(ename) jack;
//在where当中索引列使用了函数
失效67..... 4.索引的分类
单一索引一个字段上添加索引
复合索引两个字段或多个字段上添加索引
主键索引主键上添加索引
唯一性索引具有unique约束的字段添加索引
.....
注唯一性比较弱的字段上添加索引用处不大 3.视图
view站在不同的角度去看待同一份数据
1.创建视图删除视图
创建
create view dept_view as select * from dept;
删除
drop view dept_view;
注只有DQL语句才能以view的形式创建
create view dept_view as DQL语句 2.用视图做什么
可以面向视图对象进行增删改查会导致原表被操作即对视图操作影响原表数据
create view dept_view as select * from dept;
insert into dept_view(deptno,dname,loc) values(1,sales,beijing);//原表插入数据
delete from dept_view;//原表被删除
在实际开发中的作用
假设有一条非常复杂的SQL语句而这条语句需要在不同位置上反复使用每一次使用都需要重新编写很麻烦这时可把这条SQL语句以视图对象形式新建在需要编写SQL语句时直接使用视图对象大大简化开发且利于后期维护只需要修改视图对象所映射的SQL语句
视图不是在内存当中也存储在硬盘上不会消失
再次注意视图对应的语句只能是DQL语句但视图对象创建完成后可对视图进行增删改查
补充增删改查又叫CRUD
Ccreate(增)
Rretrieve查检索
Uupdate改
Ddelete删 4.DBA命令(了解)
1.新建用户
create user xxx identified by 123456;
2.授权
....
3.回收
..
4.数据的导入和导出掌握
数据导出
mysqldump bjpowernodeD:\bjpowernode.sql -uroot -p***
导出指定的表
mysqldump bjpowernode emp...
//在dos命令窗口中导出
数据导入
创建数据库create database bjpowernode;
使用数据库use bjpowernode;
初始化数据库source D:\bjpowernode.sql
//先登录到MySQL数据库服务器上 5.数据库设计三范式
数据库设计范式
数据库的设计依据教你怎么进行数据库表的设计
第一范式要求如何一张表必须有主键每一个字段原子性不可再分
第二范式建立在第一范式的基础上要求所有非主键字段完全依赖主键不要产生部分依赖
第三范式建立在第二范式的基础上要求所有非主键字段直接依赖主键不要产生传递依赖
设计数据库表时按照以上范式可避免表中数据冗余空间浪费 1.第一范式
最核心最重要的范式所有表的设计都需满足
必须有主键且每个字段都是原子性不可再分
编号姓名联系方式1000张三zs123.com,139599999991001李四ls123.com,139566666661002王五ww123.com,13958888888以上学生表不满足第一范式
1.没有主键
2.联系方式可再分为邮箱和电话
编号pk姓名邮箱电话1000张三zs123.com139599999991001李四ls123.com139566666661002王五ww123.com13958888888
口诀一对一若表很庞大拆分为两张表
外键unique约束
一对一外键唯一 2.第二范式
建立在第一范式基础上要求所有非主键字段必须完全依赖主键不产生部分依赖
学生与老师关系表1个学生可能有多个老师1个老师可能有多个学生
复合主键学生编号教师编号pk
学生编号教师编号学生姓名教师姓名1001001张三王老师1002002李四赵老师1003001王五王老师1001002张三赵老师
不满足第二范式
‘张三’依赖1001‘王老师’依赖001产生了部份依赖
部份依赖缺点数据冗余空间浪费‘张三’‘王老师’重复
为了满足第二范式使用三张表表示多对多关系
学生表
学生编号pk学生名字1001张三1002李四1003王五
教师表
教师编号pk教师名字001王老师002赵老师
学生教师关系表
id(pk)学生编号fk教师编号fk11001001210020023100300141001002
口诀多多对怎么设计
多对多三张表关系表两个外键 3.第三范式
建立在第二范式基础上要求所有非主键字段必须直接依赖主键不产生传递依赖
学生编号pk学生姓名班级编号班级名称1001张三01高三一班1002李四02高三二班1003王五03高三三班1004赵六03高三三班
以上表格满足第一范式有主键满足第二范式主键不是复合主键没有产生部分依赖
不满足第三范式
高三一班依赖0101依赖1001产生了传递依赖产生了数据冗余
设计一对多
班级表一
班级编号pk班级名称01高三一班02高三二班03高三三班
学生表多
学生编号pk学生姓名班级编号fk1001张三011002李四021003王五031004赵六03
口诀
一对多两张表多的表加外键 注数据库设计三范式是理论上的实践上有偏差最终目的是为了满足客户需求有时会拿冗余换执行速度因为SQL中表和表之间连接次数多效率越低笛卡尔积有时可能存在冗余但为了减少表的连接次数这样做也合理对于开发人员来说SQL语句的编写难度也降低