一、事务
1.什么是事务
事务是一组由DML语句组成,这组语句要么全部成功,要么全部失败,是一个整体。
2.为什么需要事务
3.事务的基本操作
开始一个事务 start transaction;
创建一个保存点 savepoint 保存点名;
回到保存点 rollback to 保存点名;
--创建一张学生数学成绩表
mysql> create table score(id int , name varchar(32),math int);
Query OK, 0 rows affected (0.64 sec)
--插入学生数据
mysql> insert into score values(1,'Alice',90),(2,'Bob',95);
Query OK, 2 rows affected (0.27 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select* from score;
+------+-------+------+
| id | name | math |
+------+-------+------+
| 1 | Alice | 90 |
| 2 | Bob | 95 |
+------+-------+------+
2 rows in set (0.00 sec)
--发现给Alice应该多加的5分加到了Bob成绩上,进行修改
--创建事务
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)
--创建保存点a;
mysql> savepoint a;
Query OK, 0 rows affected (0.10 sec)
mysql> select* from score;
+------+-------+------+
| id | name | math |
+------+-------+------+
| 1 | Alice | 90 |
| 2 | Bob | 95 |
+------+-------+------+
2 rows in set (0.00 sec)
--给Alice成绩加5分
mysql> update score set math = math+5 where name like 'Alice';
Query OK, 1 row affected (0.02 sec)
Rows matched: 1 Changed: 1 Warnings: 0
--创建保存点b
mysql> savepoint b;
Query OK, 0 rows affected (0.10 sec)
--给Bob成绩减5分
mysql> update score set math = math-50 where name like 'Bob';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
--查询成绩表发现Bob成绩修改时出现了问题
mysql> select* from score;
+------+-------+------+
| id | name | math |
+------+-------+------+
| 1 | Alice | 95 |
| 2 | Bob | 45 |
+------+-------+------+
2 rows in set (0.00 sec)
--返回保存点b
mysql> rollback to b;
Query OK, 0 rows affected (0.10 sec)
--对Bob成绩重新修改
mysql> update score set math = math-5 where name like 'Bob';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
--再次查询成绩表获得正确成绩
mysql> select* from score;
+------+-------+------+
| id | name | math |
+------+-------+------+
| 1 | Alice | 95 |
| 2 | Bob | 90 |
+------+-------+------+
2 rows in set (0.00 sec)
4.事务的隔离级别
当MySQL表被多个线程或者客户端开启各自事务操作数据库中的数据时,MySQL提供了一种机制,使不同的事务在操作数据时,具有隔离性。从而保证数据的一致性。
4.1无隔离会出现的问题
脏读
不可重复读
幻读
4.2事务的隔离级别
读未提交(read uncommited)
读已提交(read commited)
可重复读(repeatable read):MySQL默认的隔离级别,不会发生脏读、不可重复读、幻读等问题。
可串行化(serializable)
4.2.1设置事务的隔离级别
set session transaction isolation level read uncommited;
4.2.2查看当前隔离级别
select @@tx_isolation;
5.事务的ACID特性
原子性(Atomicity):
事务是应用中最小的执行单位,就如原子是自然界的最小颗粒,具有不可再分的特征一样,事务是应用中不可再分 的最小逻辑执行体。
一致性(Consistency):
事务执行的结果,必须使数据库从一个一致性状态,变到另一个一致性状态。当数据库只包含事务成功提交的结果 时,数据库处于一致性状态。如果系统运行发生中断,某个事务尚未完成而被迫中断,而改未完成的事务对数据库 所做的修改已被写入数据库,此时数据库就处于一种不正确(不一致)的状态。因此一致性是通过原子性来保证 的。
隔离性(Isolation):
各个事务的执行互不干扰,任意一个事务的内部操作对其他并发事务都是隔离的。也就是说,并发执行的事务之间 不能看到对方的中间状态,并发执行的事务之间不能互相影响。
持久性(Durability):
持久性是指一个事务一旦被提交,它对数据库所做的改变都要记录到永久存储其中(如:磁盘)
二、视图
1.什么是视图
视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。视图的数据变 化会影响到基表,基表的数据变化也会影响到视图。
2.视图的基本使用
2.1视图的创建
create view 视图名 as select 语句;
--如下是一张学生数学成绩表
+------+-------+------+
| id | name | math |
+------+-------+------+
| 1 | Alice | 90 |
| 2 | Bob | 95 |
+------+-------+------+
--创建视图
mysql> create view score_view as select id,math from score where math>0;
Query OK, 0 rows affected (3.20 sec)
mysql> select * from score_view;
+------+------+
| id | math |
+------+------+
| 1 | 90 |
| 2 | 95 |
+------+------+
2 rows in set (0.81 sec)
--修改视图中id为1的数学成绩改为30
mysql> update score_view set math = 30 where id = 1;
Query OK, 1 row affected (2.77 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from score_view;
+------+------+
| id | math |
+------+------+
| 1 | 30 |
| 2 | 95 |
+------+------+
2 rows in set (0.00 sec)
--查看原表,id为1的同学数学成绩也变为30
mysql> select * from score;
+------+-------+------+
| id | name | math |
+------+-------+------+
| 1 | Alice | 30 |
| 2 | Bob | 95 |
+------+-------+------+
2 rows in set (0.00 sec)
2.2视图的规则与限制
视图命名唯一,不可重复,不可与表名相同
创建视图数目无限制,但要考虑性能影响
视图不可以添加索引
视图可以提高安全性,必须有足够的访问权限
从视图检索数据 select 中含有 order by ,那么该视图中的 order by 将被覆盖