1.什么是事务
事务(TRANSACTION)是作为单个逻辑工作单元执行的一系列操作 多个操作作为一个整体向系统提交,要么都执行、要么都不执行 事务是一个不可分割的工作逻辑单元
转账过程就是一个整体 它需要两条UPDATE语句来完成,这两条语句是一个整体 如果其中任一条出现错误,则整个转账业务也应取消,两个账户中的余额应恢复到原来的数据,从而确保转账前和转账后的余额不变,即都是1001元
2.事务的特性
事务必须具备以下四个属性,简称ACID 属性
原子性(Atomicity)
事务是一个完整的操作,事务的各部操作是不可分的(原子的),要么都执行,要么都不执行
一致性(Consistency)
当事务完成时,数据必须处于一致状态
隔离性(Isolation)
并发事务之间彼此隔离。独立,他不应以任何方式依赖或影响其他事务
持久性(Durability)
事务完成后,他对数据库的修改已被永久保持
3.如何创建事务
MySQL中支持事务的存储引擎有InnoDB和BDB
注意:begin开启事务之后如果没有commit提交的话,在数据库里面查到的数据是修改了的,在cmd中查询数据是没有修改的,需要提交之后才真正修改,没有提交之前可以通过rollback回滚事务还原数据库里面的数据,但如果提交了之后就回滚不了
语法:
(1)开始事务
BEGIN ; 或 START TRANSACTION;
(2)提交事务
COMMIT;
(3)回滚(撤销)事务
ROLLBACK;
4.自动关闭和开启事务
默认情况下,每条单独的SQL语句视为一个事务
关闭默认提交状态后,可手动开启、关闭事务
SET autocommit = 0|1;
关闭/开启自动提交状态
值为0:关闭自动提交 值为1:开启自动提交
关闭自动提交后,从下一条SQL语句开始则开启新事务,需使用COMMIT或ROLLBACK语句结束该事务
事务部分的示例:
create database mybank;
DROP TABLE IF EXISTS BANK;
create table `bank`(
`customerName` varchar(50),
`currentMoney` decimal(10,2)
);
insert into bank
values('张三','1000'),('李四',1);
select * from bank;
/*模拟转账*/
begin;
update bank set currentMoney = currentMoney-500
where customerName = '张三';
update bank set currentMoney = currentMoney + 500
where customerName = '李四';
commit;
rollback;
update bank set currentMoney = currentMoney + 500
where customerName = '张三';
update bank set currentMoney = currentMoney - 500
where customerName = '李四';
/*关闭自动提交事务*/
set autocommit = 0;
/*打开自动提交事务(默认)*/
set autocommit = 1;
事务是指逻辑上的一组操作,组成这组操作的各个单元,要不全成功要不全失败。
- 支持连续SQL的集体成功或集体撤销。
- 事务是数据库在数据完整性方面的一个功能。
- 需要利用 InnoDB 或 BDB 存储引擎,对自动提交的特性支持完成。
- InnoDB被称为事务安全型引擎。
-- 事务开启
START TRANSACTION; 或者 BEGIN;
开启事务后,所有被执行的SQL语句均被认作当前事务内的SQL语句。
-- 事务提交
JDX制作17. 锁表
18. 触发器
COMMIT;
-- 事务回滚
ROLLBACK;
如果部分操作发生问题,映射到事务开启前。
-- 事务的特性
1. 原子性(
Atomicity)
事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
2. 一致性(Consistency)
事务前后数据的完整性必须保持一致。
- 事务开始和结束时,外部数据一致
- 在整个事务过程中,操作是连续的
3. 隔离性(Isolation)
多个用户并发访问数据库时,一个用户的事务不能被其它用户的事物所干扰,多个并发事务之间的
数据要相互隔离。
4. 持久性(Durability)
一个事务一旦被提交,它对数据库中的数据改变就是永久性的。
-- 事务的实现
1. 要求是事务支持的表类型
2. 执行一组相关的操作前开启事务
3. 整组操作完成后,都成功,则提交;如果存在失败,选择回滚,则会回到事务开始的备份点。
-- 事务的原理
利用InnoDB的自动提交(autocommit)特性完成。
普通的MySQL执行语句后,当前的数据提交操作均可被其他客户端可见。
而事务是暂时关闭“自动提交”机制,需要commit提交持久化数据操作。
-- 注意
1. 数据定义语言(DDL)语句不能被回滚,比如创建或取消数据库的语句,和创建、取消或更改表或存
储的子程序的语句。
2. 事务不能被嵌套
-- 保存点
SAVEPOINT 保存点名称 -- 设置一个事务保存点
ROLLBACK TO SAVEPOINT 保存点名称 -- 回滚到保存点
RELEASE SAVEPOINT 保存点名称 -- 删除保存点
-- InnoDB自动提交特性设置
SET autocommit = 0|1; 0表示关闭自动提交,1表示开启自动提交。
- 如果关闭了,那普通操作的结果对其他客户端也不可见,需要commit提交后才能持久化数据操作。
- 也可以关闭自动提交来开启事务。但与START TRANSACTION不同的是,
SET autocommit是永久改变服务器的设置,直到下次再次修改该设置。(针对当前连接)
而START TRANSACTION记录开启前的状态,而一旦事务提交或回滚后就需要再次开启事务。(针
对当前事务)
5.什么是视图
(1)视图是一张虚拟表
表示一张表的部分数据或多张表的综合数据 其结构和数据是建立在对表的查询基础上
(2)视图中不存放数据
数据存放在视图所引用的原始表中
(3)一个原始表,根据不同用户的不同需求,可以创建不同的视图
6.视图的用途
筛选表中的行 防止未经许可的用户访问敏感数据 降低数据库的复杂程度 将多个物理数据库抽象为一个逻辑数据库
7.如何创建视图
(1)使用SQL语句创建视图
语法:
create view view_name as <select 语句>;
(2)使用SQL语句删除视图
DROP VIEW [IF EXISTS] view_name;//删除前判断视图是否存在
(3)使用SQL语句查看视图
SELECT 字段1, 字段2, …… FROM view_name;
8.使用视图注意事项
视图中可以使用多个表 一个视图可以嵌套另一个视图 对视图数据进行添加、更新和删除操作直接影响所引用表中的数据 当视图数据来自多个表时,不允许添加和删除数据,一个表时可以进行修改
5.查看所有视图
USE information_schema; SELECT * FROM views\G;
使用视图修改数据会有许多限制,一般在实际开发中视图仅用作查询
示例:
/*创建视图 创建前先判断是否存在,如存在则删除*/
use house;
drop view if exists view_house;
create view view_house
as select * from hos_house;
select * from view_house;
update view_house set copy ='中关村'
where hmid ='1';
/*创建学生成绩表视图*/
use myschooltwo;
drop view if exists view_student_result;
create view view_student_result
as select s.studentName as 姓名,
s.studentNo as 学号,
r.studentResult as 成绩,
so.subjectName as 课程名称,
r.examDate as 考试日期
from student as s
inner join result as r
on s.studentNo = r.studentNo
inner join subject as so
on r.subjectNo = so.subjectNo
order by s.studentNo;
select *,count(*)from view_student_result ;
9.锁表
/* 锁表 */ 表锁定只用于防止其它客户端进行不正当地读取和写入 MyISAM 支持表锁,InnoDB 支持行锁 -- 锁定 LOCK TABLES tbl_name [AS alias] -- 解锁 UNLOCK TABLES
10.什么是索引
汉语字典中的汉字按页存放,一般都有汉语拼音目录(索引)、偏旁部首目录等 我们可以根据拼音或偏旁部首,快速查找某个字词
(1)索引是一种有效组合数据的方式,为快速查找到指定记录
(2)作用 :
大大提高数据库的检索速度 改善数据库性能
(3)MySQL索引按存储类型分类
B-树索引:InnoDB、MyISAM均支持 哈希索引
10.常用索引类型
(1)普通索引
基本索引类型 允许在定义索引的列中插入重复值和空值
(2)唯一索引
索引列数据不重复 允许有空值
(3)主键索引
主键列中的每个值是非空、唯一的 一个主键将自动创建主键索引
(4)复合索引
将多个列组合作为索引
(5)全文索引
支持值的全文查找 允许重复值和空值
(6)空间索引
对空间数据类型的列建立的索引