TCL语言的学习
transaction control language 事务控制语言
事务
一个或一组SQL语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行。
事务由单独单元的一个或多个SQL语句组成,在这个单元中,每个MySQL语句是相互依赖的。而整个单独单元作为一个不可分割的整体,如果单元中某条SQL语句一旦执行失败或产生错误,整个单元将会回滚。所有受到影响的数据将返回到事物开始以前的状态;如果单元中的所有SQL语句均执行成功,则事物被顺利执行。
存储引擎:
1、概念:在MySQL中的数据用各种不同的技术存储在文件(或内存)中。
2、通过show engines:来查看MySQL支持的存储引擎。
3、在MySQL中用的最多的存储引擎有:innodb,myisam,memory等。其中innodb支持事务,而myisam,memory等不支持事务。
事务的ACID属性:
1、原子性:一个事务不可再分割,要么执行,要么都不执行
2、一致性:一个事务执行会使数据从一个一致状态切换到另一个一致状态
3、隔离性:一个事务的执行不受其他事务的干扰
4、持久性:一个事务一旦提交,则会永久的改变数据库的数据
事务的创建
隐式事务:事务没有明显的开启和结束的标记。如insert、update、delete语句
显式事务:事务有明显的开启和结束的标记。前提:必须先设置自动提交功能为禁用
使用显示事务:
步骤1:开启事务
set autocommit=0;
start transaction;可选的
步骤2:编写事务中的SQL语句
select insert / update / delete
语句1;
语句2;
……
设置回滚点:savepoint 回滚点名;
步骤3:结束事务
commit;提交事务
rollback;回滚事务
回滚到指定的地方:rollback to 回滚点名;
并发事务
1、事务的并发问题是如何发生的?
多个事务 同时 操作 同一个数据库的相同数据时
2、并发问题都有哪些?
脏读:一个事务读取了其他事务还没有提交的数据,只是读到其他事务“更新”的数据
不可重复读:一个事务多次读取,结果不一样
幻读:一个事务读取了其他事务还没有提交的数据,只是读到其他事务“插入”的数据
对于同时运行的多个事务,当这些事务访问数据库中相同的数据时,如果没有采取必要的隔离机制,就会导致各种并发问题:
(1)脏读:对于两个事务T1,T2,T1读取了已经被T2更新但还没有被提交的字段,之后,若T2回滚,T1读取的内容就是临时且无效的。
(2)不可重复读:对于两个事务T1,T2,T1读取了一个字段,然后T2更新了该字段,之后,T1再次读取同一个字段,值就不同了。
(3)幻读:对于两个事务T1,T2,T1从一个表中读取了一个字段,然后T2在该表中插入了一些新的行,之后,如果T1再次读取同一个表,就会多出几行。
数据库事务的隔离性:数据库系统必须具有隔离并发运行各个事务的能力,使他们不会相互影响,避免各种并发问题。
一个事务与其他事务隔离的程度称为隔离级别,数据库规定了多种事务隔离级别,不同隔离级别对应不同的干扰程度,隔离级别越高,数据一致性就越好,但并发性越弱。
3、如何解决并发问题?
通过设置隔离级别来解决并发问题
4、事务的隔离级别:
脏读 | 不可重复读 | 幻读 | |
read uncommitted | √ | √ | √ |
read committed | × | √ | √ |
repeatable read | × | × | √ |
serializable | × | × | × |
MySQL中默认第三个隔离级别repeatable read
Oracle中默认第二个隔离级别read committed
查看隔离级别
select @@tx_isolation;
设置隔离级别
set session|global transaction isolation level 隔离级别;
数据库提供的4种事务隔离级别:
隔离级别 |
描述 |
READ UNCOMMITTED(读未提交数据) |
允许事务读取未被其他事务提交的变更、脏读、不可重复读和幻读的问题都会出现。 |
READ COMMITED(读已提交数据) |
只允许事务读取已经被其他事务提交的变更,可以避免脏读,但不可重复读和幻读问题仍然可能出现。 |
REPEATELE READ(可重复读) |
确保事务可以多次从一个字段中读取相同的值,在这个事务持续期间,禁止其他事务对这个字段进行更新,可以避免脏读和不可重复读,但幻读的问题仍然存在。 |
SWRIALIZABLE(串行化) |
确保事务可以从一个表中读取相同的行,在这个事务持续期间,禁止其他事务对该表执行插入,更新和删除操作,所有并发问题都可以避免,但性能十分低下。 |
每启动一个MySQL程序,就会获得一个单独的数据库连接,每个数据库连接都有一个全局变量@@tx_isolation,表示当前的事务隔离级别。
查看当前的隔离级别:SELECT@@tx_isolation。
设置当前MySQL连接的隔离级别:
set transaction isolation level read committed
设置数据库系统的全局的隔离级别:
set global transaction isolation level read committed
视图
含义:
虚拟表,和普通表一样使用
MySQL51版本出现的新特性,是通过表动态生成的数据
比如:舞蹈班和普通版的对比
视图:一种虚拟存在的表,行和列的数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的,只保存了SQL逻辑,不保存查询结果。
应用场景:
多个地方用到同样的查询结果
该查询结果使用的SQL语句较复杂
视图的优点:
1、简化SQL语句
2、提高了SQL的重用性
3、保护基表的数据,提高了安全性
一、创建视图
语法:
create view 视图名 as查询语句;
二、视图的修改
方式一:
语法:
createor replace view 视图名 as查询语句;
方式二:
语法:
alter view 视图名 as查询语句;
三、删除视图
语法:
drop view 视图名,视图名,……;
四、查看视图
desc 视图名; show create view 视图名;
五、视图的更新
具备以下特点的视图不允许更新:
1、包含以下关键字的SQL语句:分组函数、distinct、group by、having、union或union all
2、常量视图
3、select中包含子查询
4、join
5、from一个不能更新的视图
6、where子句的子查询引用了from子句中的表
视图PK表:
创建语法的关键字 | 是否实际占用物理空间 | ||
视图 | create view | 只是保存了SQL逻辑 | 增删改查,一般不能增删改 |
表 | create table | 保存了数据 | 增删改查 |