• MySQL的事务和视图


                    事务

    1.概念

    一条或者多条sql语句的集合!
     事务:就是一堆操作的集合,他们同生共死。要么都执行成功,要么都执行失败
    2.事务的特性  ACID
      A:原子性  完整的,不可分割的

      原子性 (Atomicity):在事务中的操作,要么都执行,要么都不执行!


      C: 一致性  事务执行完毕后,数据的状态是一致的()

      一致性(Consistency):事务必须保证数据库从一个一致性的状态变成另一个一致性的状态!


      I: ISOLation 隔离性  两个事务执行互不影响

      隔离性(Isolation):每个事务之间互不干扰!哪怕是并发执行也不干扰!


      D: 永久性  事务执行完后,对数据的影响是永久的。

      持久性(Durability):事务一旦被改变,那么对数据库中数据的影响是永久性的!

    3.事务操作的关键字
      自动提交事务开关set autocommit=0
      开始事务 start transaction /begin
      提交事务 commit
      回滚事务 rollback
      set autocommit=1
    4.事务+++存储过程 转账的例子
     
    DELIMITER $$
    CREATE PROCEDURE usp_transfer()
        BEGIN 
        ##错误总数默认是0
        DECLARE t_error INTEGER DEFAULT 0; 
        ## continue 继续  hanlder 执行   并且对 t_error重新赋值为1
        DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error=1; 
        SET autocommit=0;
            START TRANSACTION; 
            UPDATE bank SET balance=balance-100 WHERE cid=1;   
            UPDATE bank SET balance =balance+100 WHERE cid=2;
            IF t_error > 0 THEN 
                ROLLBACK; 
            ELSE 
                COMMIT; 
            END IF; 
         SET autocommit=1;
        END$$ 
    DELIMITER ; 
     
    CALL test_sp800()

    定义一个存储过程的最简易的语法是
    delimiter $$
    create procedure usp_stulist()
    begin
      select * from student
    end$$
    delimiter;


              模拟 银行转账!                          

    --   创建数据库
    CREATE DATABASE  myBank;
    --  切换指定的数据库
    USE myBank;
    --  创建表
    CREATE  TABLE  IF NOT  EXISTS bank(
    customerName  VARCHAR(10) NOT NULL  COMMENT '用户名',
    currentMoney  DECIMAL(10,2) NOT NULL  COMMENT '账户余额'
    );
    -- 插入数据
    INSERT INTO bank  VALUES('小黑',50000),('小白',500000);


    --  小黑  给小白  转账10000
    --   修改两条数据
    --    01.小黑-10000
    --    02.小白+10000


    UPDATE bank SET currentMoney=currentMoney-10000
     WHERE customerName='小黑';
     --  故意写错字段名称  让02  报错
    UPDATE bank SET currentMoneysss=currentMoney+10000
     WHERE customerName='小白';
     


    --  开启事务   START TRANSACTION 或者 BEGIN
    --  01.02  为一个事务
    BEGIN
     UPDATE bank SET currentMoney=currentMoney-10000
     WHERE customerName='小黑';
     UPDATE bank SET currentMoneysss=currentMoney+10000
     WHERE customerName='小白';
    --  事务回滚  ROLLBACK
    --  提交事务 COMMIT

    UPDATE bank SET currentMoney=500000
     WHERE customerName='小黑';
    --  证明mysql是默认提交事务的!

    SET  autocommit=0(关闭事务自动提交) | 1(开启事务自动提交)

    -- 关闭事务自动提交
    SET  autocommit=0;

    BEGIN;   --  开启事务
     UPDATE bank SET currentMoney=currentMoney-10000
     WHERE customerName='小黑';
     UPDATE bank SET currentMoney=currentMoney+10000
     WHERE customerName='小白';
    COMMIT;  --  手动提交事务
      UPDATE  bank SET currentMoney=10000;
    ROLLBACK;   -- 事务回滚

    SET  autocommit=1;  -- 恢复自动提交

    1.概念

    一条或者多条sql语句的集合!
     事务:就是一堆操作的集合,他们同生共死。要么都执行成功,要么都执行失败
    2.事务的特性  ACID
      A:原子性  完整的,不可分割的

      原子性 (Atomicity):在事务中的操作,要么都执行,要么都不执行!


      C: 一致性  事务执行完毕后,数据的状态是一致的()

      一致性(Consistency):事务必须保证数据库从一个一致性的状态变成另一个一致性的状态!


      I: ISOLation 隔离性  两个事务执行互不影响

      隔离性(Isolation):每个事务之间互不干扰!哪怕是并发执行也不干扰!


      D: 永久性  事务执行完后,对数据的影响是永久的。

      持久性(Durability):事务一旦被改变,那么对数据库中数据的影响是永久性的!

    3.事务操作的关键字
      自动提交事务开关set autocommit=1
      开始事务 start transaction /begin
      提交事务 commit
      回滚事务 rollback
      set autocommit=1
    4.事务+++存储过程 转账的例子
     
    DELIMITER $$
    CREATE PROCEDURE usp_transfer()
        BEGIN 
        ##错误总数默认是0
        DECLARE t_error INTEGER DEFAULT 0; 
        ## continue 继续  hanlder 执行   并且对 t_error重新赋值为1
        DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error=1; 
        SET autocommit=0;
            START TRANSACTION; 
            UPDATE bank SET balance=balance-100 WHERE cid=1;   
            UPDATE bank SET balance =balance+100 WHERE cid=2;
            IF t_error > 0 THEN 
                ROLLBACK; 
            ELSE 
                COMMIT; 
            END IF; 
         SET autocommit=1;
        END$$ 
    DELIMITER ; 
     
    CALL test_sp800()

    定义一个存储过程的最简易的语法是
    delimiter $$
    create procedure usp_stulist()
    begin
      select * from student
    end$$
    delimiter;


              模拟 银行转账!                          

    --   创建数据库
    CREATE DATABASE  myBank;
    --  切换指定的数据库
    USE myBank;
    --  创建表
    CREATE  TABLE  IF NOT  EXISTS bank(
    customerName  VARCHAR(10) NOT NULL  COMMENT '用户名',
    currentMoney  DECIMAL(10,2) NOT NULL  COMMENT '账户余额'
    );
    -- 插入数据
    INSERT INTO bank  VALUES('小黑',50000),('小白',500000);


    --  小黑  给小白  转账10000
    --   修改两条数据
    --    01.小黑-10000
    --    02.小白+10000


    UPDATE bank SET currentMoney=currentMoney-10000
     WHERE customerName='小黑';
     --  故意写错字段名称  让02  报错
    UPDATE bank SET currentMoneysss=currentMoney+10000
     WHERE customerName='小白';
     


    --  开启事务   START TRANSACTION 或者 BEGIN
    --  01.02  为一个事务
    BEGIN
     UPDATE bank SET currentMoney=currentMoney-10000
     WHERE customerName='小黑';
     UPDATE bank SET currentMoneysss=currentMoney+10000
     WHERE customerName='小白';
    --  事务回滚  ROLLBACK
    --  提交事务 COMMIT

    UPDATE bank SET currentMoney=500000
     WHERE customerName='小黑';
    --  证明mysql是默认提交事务的!

    SET  autocommit=0(关闭事务自动提交) | 1(开启事务自动提交)

    -- 关闭事务自动提交
    SET  autocommit=0;

    BEGIN;   --  开启事务
     UPDATE bank SET currentMoney=currentMoney-10000
     WHERE customerName='小黑';
     UPDATE bank SET currentMoney=currentMoney+10000
     WHERE customerName='小白';
    COMMIT;  --  手动提交事务
      UPDATE  bank SET currentMoney=10000;
    ROLLBACK;   -- 事务回滚

    SET  autocommit=1;  -- 恢复自动提交

                视图

    1.视图: 就是一张虚拟表,本质上存储的是一对SQL的集合

    --  视图 是一张虚拟的表
       01.表示一张表的部分数据或者是多张表的综合数据!
       02.结构和数据都是建立在对真表的查询基础之上的!
       03.视图中存放的数据其实就是对真实表的引用!
         对视图中的数据进行添加,更新删除都会影响到真实的表!
       04.一个真实的表可以创建N个视图!
       05.如果视图关联了多表,不允许增 删!单表可以增删改
       06.视图一般都是使用查询!

    2.定义视图的语法:
    create view VW_stulist(VW_视图的功能)
    as
    sql语句
     小Tip:当多表中有同名列的时候,在视图这个虚拟表中,只能有一列。手工指定该列是哪个表的

    3.视图的使用 和检索基本表一样,直接通过select
    select * from VW_stulist

    4.删除视图
    drop view 视图名
    drop table
    drop database
    drop index
    drop constraint
    归根结底:drop  删除是结构   delete 删除数据

    5.查看所有库所有视图

     5.1.切换到系统数据库
      use information_schema

     5.2.select * from views G;

     6.查看当前库的所有视图
       show tables status where comment='view'

     7.视图注意事项
    1)视图可以查询多表数据
    2)视图可以嵌套
    3)update,insert,delete不能封装成视图内容,通过图形化界面可以操作数据(操作视图数据,影响的是基本表)。
    4)删除视图数据的时候,有一定的限定,数据结果来源于多表的时候,不能删除

    --  创建一个视图  只获取 学生姓名 编号 以及考试成绩
    CREATE  VIEW view_student_result
    AS
    SELECT s.studentNo 学生编号,studentName 学生姓名,
    studentResult 考试成绩
    FROM  student s,result r
    WHERE s.`studentNo`=r.`studentNo`
    --  查询视图中的内容
    SELECT * FROM view_student_result
    -- 查询mysql数据库中所有的视图
    SELECT * FROM information_schema.views;
    --  删除视图
    DROP  VIEW view_student_result;

    --  创建一个表的视图  学生姓名,地址,手机号
    CREATE VIEW  view_student
    AS
    SELECT  studentName 学生姓名,address 地址,phone 手机号
    FROM  student

    -- 查询视图

    SELECT  * FROM view_student 

  • 相关阅读:
    Spring MVC Controller中GET方式传过来的中文参数会乱码的问题
    解决Scala异常处理java.lang.OutOfMemoryError: Java heap space error
    sbt的安装设置
    Oracle VM VirtualBox 设置本机与虚拟机共享文件
    Hadoop fs命令详解
    Oracle 11g CPU负载很高紧急处理【负载100%】
    Oracle单表备份三种方案
    Nginx1.9.xx以后版支持4层tcp转发
    用SQL命令查看Mysql数据库大小
    Jenkins: ERROR: Exception when publishing, exception message [java.net.SocketException: Broken pipe (Write failed)]
  • 原文地址:https://www.cnblogs.com/fl72/p/8463997.html
Copyright © 2020-2023  润新知