【数据库(四)】TCL语言的学习



相关的背景知识


1)什么是TCL语言?

TCL(Transaction Control Language)即事务控制语言。

有时候我们的一个需求(一个任务),可能会涉及到多个DML(增删改)操作。那么这一系列操作, 我们要看成一个整体,不可切割
如在一个员工系统中,某员工A的数据可能会存在多个表中,如基本信息表,业务信息表,邮箱信息表等。当我们想删除此人的所有信息时,除了删除这个人的基本信息外,还应该删除与此人有关的其他所有信息,如邮箱,地址等等。这样的操作会涉及到多个DML语句。那么从开始执行到真正结束,就会构成一个事务(Transaction)。对于事务,我们要保证事务的完整性,不能分割。事务要么成功, 要么撤回(回到执行前),不能执行一部分就终止。


注意,只有DML操作时,才会涉及到事务。而mysql数据库在执行完每一个DML操作时,会默认commit; 可以使用start transaction来取消自动提交

2)事务

2.1 什么是事务?

事务由单独单元的一个或多个SQL语句组成,在这个单元中,每个MySQL语句是相互依赖的。而整个单独单元作为一个不可分割的整体,如果单元中某条SQL语句一旦执行失败或产生错误,整个单元将会回滚,所有受到影响的数据将返回到事物开始以前的状态。如果单元中的所有SQL语句均执行成功,则事物被顺利执行。

举例
转账
update 表 set 张三丰的余额=500 where name=‘张三丰’
update 表 set 郭襄的余额=500 where name=‘郭襄’

2.2 存储引擎

  • 概念:在mysql中的数据用各种不同的技术存储在文件(或内存)中。

  • 通过show engines;来查看mysql支持的存储引擎。

  • 在mysql中用的最多的存储引擎有:innodb,myisam ,memory 等。其中innodb支持事务,而myisam、memory等不支持事务

2.3 事务的属性(ACID)【重点】

  • 原子性(Atomicity):要么都执行,要么都回滚。
  • 一致性(Consistency):保证数据的状态操作前和操作后保持一致。
  • 隔离性(Isolation):多个事务同时操作相同数据库的同一个数据时,一个事务的执行不受另外一个事务的干扰。
  • 持久性(Durability):一个事务一旦提交,则数据将持久化到本地,除非其他事务对其进行修改。

2.4 事务的分类

  • 隐式事务(没有明显的开启和结束事务的标志)

    比如 insert、update、delete语句本身就是一个事务

  • 显式事务(具有明显的开启和结束事务的标志)

    1、开启事务
    set autocommit=0;
    start transaction; 【可选】
    
    • 取消自动提交事务的功能(只针对当前会话有效):set autocommit=0;

    2、编写事务的一组逻辑操作单元(多条sql语句)
    • select
    • insert
    • update
    • delete
    3、提交事务或回滚事务
    • 提交事务commit;
    • 回滚事务rollback;
    • 设置节点(保存点)savepoint;
      • 搭配rollback使用,回滚到保存点:

        SET autocommit=0;
        START TRANSACTION;
        DELETE FROM account WHERE id=1;
        SAVEPOINT a;
        DELETE FROM account WHERE id=5;
        ROLLBACK TO a;
        

2.5 事务的隔离级别:

2.5.1 事务并发问题如何发生?

对于同时运行的多个事务,当这些事务访问数据库中相同的数据时,如果没有采取必要的隔离机制,就会导致各种并发问题。

2.5.2 并发问题类型

  • 脏读:

    一个事务读取到了另外一个事务未提交的数据。针对的是更新。

  • 不可重复读:

    同一个事务中,多次读取到的数据不一致。

  • 幻读:

    一个事务读取数据时,另外一个事务进行更新,导致第一个事务读取到了没有更新的数据。针对的是插入。

2.5.3 如何避免事务的并发问题?

  • 通过设置事务的隔离级别:

    在这里插入图片描述
    1、READ UNCOMMITTED
    2、READ COMMITTED 可以避免脏读
    3、REPEATABLE READ 可以避免脏读、不可重复读和一部分幻读。
    4、SERIALIZABLE可以避免脏读、不可重复读和幻读(有锁,所以效率会低一些)。

  • Mysql
    Mysql支持 4 种事务隔离级别.
    Mysql 默认的事务隔离级别为: REPEATABLE READ
  • Oracle
    Oracle 支持的 2 种事务隔离级别:READ COMMITED, SERIALIZABLE。
    Oracle 默认的事务隔离级别为: READ COMMITED
  • 查看隔离级别:
    select @@tx_isolation;
    
  • 设置隔离级别:
    set session|global  transaction isolation level 隔离级别名;
    

3)视图

3.1 什么是视图?

MySQL从5.0.1版本开始提供视图功能。是一种虚拟存在的表,行和列的数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的,只保存了sql逻辑,不保存查询结果

  • 应用场景:
    • 多个地方用到同样的查询结果
    • 该查询结果使用的sql语句较复杂

  • 视图的好处:
    • sql语句提高重用性,效率高
    • 和表实现了分离,提高了安全性

  • 视图VS表:

    • 创建

      视图:CREATE VIEW
      表:CREATE TABLE
      
    • 物理空间

      • 视图:只保存了sql逻辑
      • 表:保存了数据

    • 使用

      • 视图:支持增删改查,但一般只查

3.2 常见操作

  • 创建视图

    CREATE VIEW 视图名
    AS
    查询语句;
    
  • 查看视图数据

    SELECT * FROM 视图
    WHERE email LIKE '%a%';
    
  • 查看视图

    DESC 视图名;
    # 或者
    SHOW CREATE VIEW 视图名;
    
  • 修改视图

    #方式一:
    CREATE OR REPLACE VIEW 视图名
    AS
    查询语句;
    
    #方式二:
    ALTER VIEW 视图名
    AS
    查询语句;
    
  • 删除视图

    DROP VIEW 视图名,视图名,... ;
    
  • 视图的更新

    • 插入
      INSERT INTO my_v4(last_name,department_id) VALUES('虚竹',90);
      
    • 修改
      UPDATE my_v4 SET last_name ='梦姑' WHERE last_name='虚竹';
      
    • 删除
      DELETE FROM my_v4 WHERE ... ;
      
  • 某些视图不能更新:
    • 包含以下关键字的sql语句:分组函数、distinct、group by、having、union或者union all
    • 常量视图
      bash CREATE OR REPLACE VIEW 视图名 AS SELECT 'John' NAME;
    • Select中包含子查询
    • join
    • from一个不能更新的视图
    • where子句的子查询引用了from子句中的表
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值