事务、视图、锁表

115 阅读8分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第18天,点击查看活动详情

1.什么是事务

  1. 事务(TRANSACTION)是作为单个逻辑工作单元执行的一系列操作
  2. 多个操作作为一个整体向系统提交,要么都执行、要么都不执行
  3. 事务是一个不可分割的工作逻辑单元

转账过程就是一个整体 它需要两条UPDATE语句来完成,这两条语句是一个整体 如果其中任一条出现错误,则整个转账业务也应取消,两个账户中的余额应恢复到原来的数据,从而确保转账前和转账后的余额不变,即都是1001元

2.事务的特性

事务必须具备以下四个属性,简称ACID 属性

原子性(Atomicity)

事务是一个完整的操作,事务的各部操作是不可分的(原子的),要么都执行,要么都不执行

一致性(Consistency)

当事务完成时,数据必须处于一致状态

隔离性(Isolation)

并发事务之间彼此隔离。独立,他不应以任何方式依赖或影响其他事务

持久性(Durability)

事务完成后,他对数据库的修改已被永久保持

image.png 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)空间索引

对空间数据类型的列建立的索引