视图的本质是sql指令(select语句)
基本语法:create view 视图名字 as select指令;//可以是单表查询,也可以是连接查询,联合查询或者子查询
查看视图结构:视图是虚拟表.所以关于表的一些操作都适用于视图
show talbles/show create table[view]/desc 视图名字//这些命令都可以使用
视图是虚拟表:可以直接把视图当做"表"来操作,但是视图本身没有数据,是临时执行select语句得到对应的结果.视图主要用于查询操作.
基本语法: select 字段列表 from 视图 [子句];
基本语法: alter view 视图 as 新select语句;
基本语法:drop view 视图;
事务(transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit).事务通常由高级数据库操纵语言或编程语言书写的用户程序的执行所引起.事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成.
mysql允许将事务统一进行管理(存储引擎innodb),将用户所做的操作,暂时保存起来,不直接放到数据表(更新),等到结果确认后再进行操作(存入数据库).
实例:没有事务的操作
实例:有事务的操作
事务在mysql中通常是自动提交的,但是也可以使用手动事务.
MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!
一般来说,事务是必须满足4个条件(ACID)::原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。
原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
在 MySQL 命令行的默认设置下,事务都是自动提交的,即执行 SQL 语句后就会马上执行 COMMIT 操作。因此要显式地开启一个事务务须使用命令 BEGIN 或 START TRANSACTION,或者执行命令 SET AUTOCOMMIT=0,用来禁止使用当前会话的自动提交。
BEGIN 或 START TRANSACTION 显式地开启一个事务;
COMMIT 也可以使用 COMMIT WORK,不过二者是等价的。COMMIT 会提交事务,并使已对数据库进行的所有修改成为永久性的;
ROLLBACK 也可以使用 ROLLBACK WORK,不过二者是等价的。回滚会结束用户的事务,并撤销正在进行的所有未提交的修改;
SAVEPOINT identifier,SAVEPOINT 允许在事务中创建一个保存点,一个事务中可以有多个 SAVEPOINT;
RELEASE SAVEPOINT identifier 删除一个事务的保存点,当没有指定的保存点时,执行该语句会抛出一个异常;
ROLLBACK TO identifier 把事务回滚到标记点;
SET TRANSACTION 用来设置事务的隔离级别。InnoDB 存储引擎提供事务的隔离级别有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 和 SERIALIZABLE。
1、用 BEGIN, ROLLBACK, COMMIT来实现
2、直接用 SET 来改变 MySQL 的自动提交模式:
mysql> use RUNOOB;
Database changed
mysql> CREATE TABLE runoob_transaction_test( id int(5)) engine=innodb; # 创建数据表
Query OK, 0 rows affected (0.04 sec)
mysql> select * from runoob_transaction_test;
Empty set (0.01 sec)
mysql> begin; # 开始事务
Query OK, 0 rows affected (0.00 sec)
mysql> insert into runoob_transaction_test value(5);
Query OK, 1 rows affected (0.01 sec)
mysql> insert into runoob_transaction_test value(6);
Query OK, 1 rows affected (0.00 sec)
mysql> commit; # 提交事务
Query OK, 0 rows affected (0.01 sec)
mysql> select * from runoob_transaction_test;
+------+
| id |
+------+
| 5 |
| 6 |
+------+
2 rows in set (0.01 sec)
mysql> begin; # 开始事务
Query OK, 0 rows affected (0.00 sec)
mysql> insert into runoob_transaction_test values(7);
Query OK, 1 rows affected (0.00 sec)
mysql> rollback; # 回滚
Query OK, 0 rows affected (0.00 sec)
mysql> select * from runoob_transaction_test; # 因为回滚所以数据没有插入
+------+
| id |
+------+
| 5 |
| 6 |
+------+
2 rows in set (0.01 sec)
mysql>
--------------菜鸟教程的mysql事务-------结束----------
自动事务:autocommit,当客户端发送一条sql指令给服务器的时候,服务器在执行之后,不用等待用户反馈结果,会自动将结果同步到数据表.
证明:利用多个客户端查看.
如上,在第一个客户端插入数据,在第二个客户端立即查询到.
自动事务:系统做了额外的步骤来帮助用户操作,系统是通过变量来控制的.autocommit
show variables like 'autocmmit%';
关闭自动事务:关闭之后系统就不再帮助用户提交结果了
set autocommit = off;
关闭事务后我们再插入数据看看效果:
在执行事务的客户端中,系统会利用事务日志中保存的结果对数据进行自动加工.
一旦自动事务关闭,那么需要用户提供是否同步的命令
commit:提交(同步到数据库-事务清空)
rollback:回滚(清空之前的操作,丢弃)
我们进行事务提交commit,数据即可同步到数据库中,如下:
通常我们不会关闭自动事务,否则太麻烦了.
因此我们只在需要使用事务处理的时候,才会使用手动事务.
手动事务:不管开始和结束,都需要用户(程序员)手动的发送事务操作指令来实现.
手动事务对应的命令:
1. 开启事务:start transaction //从这条语句开始,后面的语句都不会写入数据表而是保存在事务日志中.
2. 事务处理: 多个写指令构成
3. 事务提交/回滚(撤销): commit提交/rollback回滚 //此时事务结束.要么成功,要么失败
执行多个sql语句.
sql语句1;
sql语句2;
sql语句3;
....
sql语句n;
确认提交:commit -- 数据存入数据表.清空事务.
回滚操作:rollback -- 所有数据无效并清空.
回滚点:savepoint,即存盘点.在执行事务的多条语句中可设置回滚点.
添加回滚点: savepoint 回滚点名字;//字母数字下划线构成
返回回滚点: rollback to 回滚点名字;//返回回滚点,其后所有sql语句操作无效.
在一个事务处理中,可以有多个回滚点.
回滚点示例:
此时如果我们想撤销刚才update语句(此处假设本语句数据有误),可返回之前定义好的回滚点sp1,如下:
撤销了(假设数据有误)update语句之后,我们可以重写新的(此处假设数据正确的)update语句,确认无误后提交事务:
提问:什么时候是行隔离?什么时候是整表隔离?
说明:如果条件中使用了索引(主键),那么系统是根据主键直接查找到某条记录,这个时候与其他记录无关,那么只隔离一条记录;反之,如果系统是通过全表检索(每一条记录都去检查,没有索引),被检索的所有数据都会被锁定(整表).
例如上例是根据匹配where stu_id主键='stu0001'来update数据的,因此是行记录隔离/锁定;
假如匹配where name非主键字段='张三'来update数据的,mysql会检索全表来匹配,因此检索的所有数据都会被锁定,即是整表锁定/隔离.
例如事务一旦被提交,即为永久性数据更改.此时即使再执行rollback回滚也是无效的.