二十九 MySQL (事务)
一 .掌握MySQL的事务处理方法
银行转账:
业务:(例如:请假报销 办卡 登录 注册)(一套固定的顺序流程)
银行转账:
史浩然转账给孔钦瑞500元
1.将A的余额扣除500
2.将B的余额添加500
UPDATE
bank
SET money = money - 500
WHERE
`name` = 'A';
UPDATE
bank
SET money = money + 500
WHERE
`name` = 'B';
事务:
一系列操作 要么同时执行成功 要么都失败
RDB 关系型 安全 事务支持好
NoSQL 非关系型 事务一般不是太强(Redis 是假事务)
Mysql: 存储引擎 INNODB(默认 高频采用) BDB才支持事务
MyISAM: 也是常用存储引擎 但是他的失误等方面不支持 他的查询性能比较强 也支持全文索引
其实在使用了支持事务的引擎之后,事务就已经在使用了!因为MySQL中默认自动提交事务。
切换手动事务/自行开启事务:BEGIN START TRANSACTION (tx)
如果没有出现异常 则应提交事务: COMMIT
如果出现异常 事务则应回滚 ROLLBACK
通过关闭自动提交来使用事务 SET auto commit= 0(关闭)| 1 (开启)
SET autocommit = 0;
SET autocommit = 1;
DELECT 和 TRNCATE 区别:
DDL delect 删除 会直接结束事务
未来和Java 、Python 、JS等集成使用的方式
JDBC Java DataBase Connectivity Java数据库连接技术
try{
// 开启事务
// 1.调用数据库执行史浩然信息更新
// 2.调用数据库执行孔钦瑞信息更新
// 提交COMMIT
}catch(Exception e){
e.printStackTrace();
// 回滚ROLLBACK
}
二.理解MySQL的ACID原则(重难 面试题)四大特性为: 原子性 一致性 隔离性 持久性
原子性:(在化学上讲究原子为最小单位 不可再分) 事务是不可分割的 要么都成功要么都失败
一致性: 事务执行前和事务执行后 数据总量不变
持久性: 事务在执行完毕之后 必须能够将数据持久保存到数据库中!
隔离性:多个事务之间 应该彼此独立不受影响。
事务并发引发的问题可能有:脏读 不可重复读 幻读/虚读
脏读: 一个事务读取到了另一个事务未提交的数据(基本不允许 因为事务有可能回滚)
不可重复读: 一个事务在执行期间读取了多次内容,结果不一样。主要针对另外一个事务对同样的内容进行了修改操作(UPDATE)
幻读/虚读: 一个事务在执行全表性的操作时,另外一个事务进行插入操作 那么热第一个十五就会发现还有未执行完的内容(INSERT)
(MySQL )四大隔离级别:读未提交,读已提交,可重复读,串行化
读未提交 :任何事物的并发问题都无法解决(基本不用)
读已提交 :能解决脏读问题!(Oracle数据库默认)
可重复读 :可以解决脏读和不可重复读问题(MySLQ默认)
串行化 :最严格的隔离级别! 可以解决所有的并发问题(基本不用)
三 了解视图的使用
视图:是一种虚拟表 可以用来降低查询的复杂度 也可以适用于不同群体对数据的不同要求
SELECT
stu.stuName,sub.subjectName,r.result,r.examDate
FROM
result r,student stu,`subject` sub
WHERE
r.stuId = stu.stuId AND r.subjectId = sub.subjectId
ORDER BY
r.result DESC , r.examDate DESC;
--视图创建:
CREATE VIEW stu_result_list AS
SELECT
stu.stuName,sub.subjectName,r.result,r.examDate
FROM
result r,student stu,`subject` sub
WHERE
r.stuId = stu.stuId AND r.subjectId = sub.subjectId
ORDER BY
r.result DESC , r.examDate DESC;
视图的使用:视图是一张虚拟表 对他的改动会影响到真实的数据物理表
SELECT * FROM stu_result_list;
注意事项:
1.视图仅仅作为查询使用即可 不要进行修改等操作
2.视图可以进行嵌套使用
3.视图的数据是来自于对应的物理表
视图删除
DROP VIEW stu_result_list;
四 .掌握数据库索引的创建(重点)
**索引:**特点 提升查询性能!。将一个列或者一组列进行相关的组合排序
原理:类似于字典前的目录页
索引的分类:
普通索引:提升查询性能
唯一索引:除了提升查询性能 还可以保证列/字段值唯一
主键索引:除了提升查询性能 还可以保证主键的特点 非空且唯一
复合索引 :
可以将多个字段列组合提升查询性能
select
name,pwd
from
xx
select
xx
from
where name = xx and pwd = xxx
全文索引:它只能在MySQL存储引擎中使用 提升大数据量情况下对文本查找的性能
空间索引
--创建索引
CREATE INDEX 索引名 ON 表名 (字段名);
-- 删除索引
DROP INDEX 索引名 ON 表名 ;
-- 查看索引列表
SHOW INDEX FROM 表名;
创建外键和主键 和唯一键都会产生对应的索引
索引并不是一味的创建即可提升性能!因为索引会占用空间!而且索引列会在操作时进行索引验证!需要谨慎的设计和使用!
设计:
【建议】
1.频繁搜索的列
2.频繁用作于查询 选择的列
3.疆场排序分组的列
4.经常用于连接的列
【不建议】
5.仅包含几个不同值的列!例如:性别 学历
6.在表中仅包含几行的! 数据不多
使用:
1.尽量不要使用*来查找数据
2.索引列应该尽量小,在字节数小的列上建立
3.如果where中有多个条件表达式 那么索引列的条件表达式要放在前面
4.避免对索引进行计算表达式!
五 了解Mysql 数据库备份和恢复
备份数据库:
mysqldump [参数选项] -u用户名 -p -h主机地址 要备份的数据库名[要备份的数据表列表] > 输出的地址
参数选项:
-add -drop-table
--表示在创建表语句前都添加 drop table 语句 可以通过 - skip - add.. 取消
-add - locks
--表示再插入数据前后加上锁表和解锁语句 可以防止插入出错!
-t (-table 减去table)
--导出数据时不添加数据结构创建的语句 SREATE TABLE
-c (compelete 完整的 )
--可以帮助我们在导出数据视 添加语句可以加上字段列表
-d (- data 减去data)
--导出时只要表结构 不要数据
-- 恢复数据库:
mysql - u用户名 -p - h主机名
在登陆MySQL服务器之后可以使用 source 命令来恢复数据库 source 数据脚本文件地址;(切换到指定的数据库)