事务
什么是事务?
事务(Transaction)是作为单个逻辑工作单位执行的一系列操作
多个操作作为一个整体向系统提交,要么都执行,要么都不执行
事务是一个不可分割的工作逻辑单元
例如:在银行转账的过程就是一个整体,这是需要使用update语句来完成,这两条语句中如果有一个出现错误,整个转账过程也会取消,因为它们这两条语句是一个整体,不能拆分开来,所以两个账户的余额都应该会恢复到原来的数据,确保转账前和转账后的余额不变
示例 :张三转账给李四
#张三的账户少500元,李四的账户多500元
update bank set currentMoney=currentMoney-500 where customerName="张三";
update bank set currentMoney=currentMoney+500 where customerName="李四";
事务发生异常,则回滚(rollback)到最初的状态;
还有一种可能就是 提交(commit)事务,提交语句之间执行的所有数据更新将永久的保存在数据库的文件中;
这两个事务中都有各自的好处所在,回滚可以恢复到开始的状态,提交可以永久保存更新的数据
事务必须具备四个属性,简称为ACID
1.原子性(Atomicity)
事务是一个完整的操作,事务的各元素都是不可分的(原子的),要么都执行,要么都不执行;
2.一致性(Consistency)
当事务完成时,数据必须处于一致状态;
3.隔离性(Isolation)
并发事务之前彼此隔离,独立,它不应以任何方式依赖于或影响其他事务;
4.持久性(Durability)
事务完成后,它对数据库的修改都会被永久保持;
如何执行事务
MySQL中支持事务的存储引擎有InnoDB和BDB
1.执行事务的语法:
SQL使用下列语句来管理事务
(1)开始事务 begin 或start transaction
(2)提交事务 commit
(3)回滚(撤销)事务 rollback
示例:从张三的账户转出500元,并且存入到李四的账户里
#使用mybank数据库
use mybank;
#开始事务(指定事务从此处开始,后续的SQL语句是一个整体)
BEGIN;
#转账:张三的账户减少500元,李四的账户增加500元
update bank set currentMoney=currentMoney-500 where customerName="张三";
update bank set currentMoney=currentMoney+500 where customerName="李四";
#提交事务,写入硬盘,永久的保存
COMMIT;
2.设置自动提交关闭和开启
MySQL中默认是开启自动提交,没指定开启事务时,每条SQL语句都单独的事务执行完毕自动提交。可以关闭自动提交的模式,可以手动提交或回滚事务。
语法:关闭/开启自动提交状态 set autocommit=0/1
值为0:关闭自动提交
值为1:开启自动提交
注意:关闭自动提交后,从下一条SQL语句开始则开启新事务,需要使用commit或rallback语句结束该事务。
#关闭事务自动提交,该语句之后为事务的开始
set autocommit=0;
#转账:张三的账户减少500元,李四的账户增加500元
update bank set currentMoney=currentMoney-500 where customerName="张三";
update bank set currentMoney=currentMoney+500 where customerName="李四";
#提交事务,写入硬盘,永久的保存
commit;
#恢复自动提交
set autocommit=1;
update bank set currentMoney=currentMoney-1000 where customerName="张三";
视图
什么是视图?
视图是一张虚拟表;
视图是另一种查看数据库中一个或多个表中数据的方法;
表示一张表的部分数据和多张表的综合数据,结构和数据建立在对表的基础上
视图它是不存放数据的,数据存放在视图所引用的原始表中
一个原始表,根据不同用户的需求,可以创建不同的视图
如何创建和使用视图?
1.使用SQL语句创建视图
语法:create view 视图名 as <select 语句>;
create view view_grade_sex as
select * from student
where gradeID=1 and sex="女";
还可以与其他的表联合查询
select r.*
from result r
inner join view_grade_sex v
on v.studentNo=r.studentNo
注:在创建视图之前,如果在数据库中已存在同名的视图的话,需要先删除在创建视图;
2.使用SQL语句删除视图
语法:drop view [if exists]视图名
注:if exists 指的是删除前判断是否存在该视图
例如:
#先判断是否存在名为view_grade_sex的视图
drop view if exists view_grade_sex;
#存在则删除,并且创建一个视图
create view view_student as
select studentNo,studentName,phone
from student
3.使用SQL语句查看视图的数据
语法:select 字段1,字段2 ,…… from view_name;
#查看view_student视图的数据
select * from view_student;
4.使用视图的注意事项:
(1)每个视图中可以使用多个表;
(2)与查询相似,一个视图可以嵌套另一个视图,最好不要超过三层;
(3)对视图数据进行添加、更新和删除操作直接引用表中的数据;
(4)当视图数据来自多个表时,不允许添加和删除数据