当前位置:   article > 正文

Mysql笔记3

Mysql笔记3

    1、快速创建表


    原理:
        将一个查询结果当做一张表新建
        这个可以完成表的快速复制
    create table emp2 as select * from emp;
    mysql> select * from emp2;
    +-------+--------+-----------+------+------------+---------+---------+--------+
    | EMPNO | ENAME  | JOB       | MGR  | HIREDATE   | SAL     | COMM    | DEPTNO |
    +-------+--------+-----------+------+------------+---------+---------+--------+
    |  7369 | SMITH  | CLERK     | 7902 | 1980-12-17 |  800.00 |    NULL |     20 |
    |  7499 | ALLEN  | SALESMAN  | 7698 | 1981-02-20 | 1600.00 |  300.00 |     30 |
    |  7521 | WARD   | SALESMAN  | 7698 | 1981-02-22 | 1250.00 |  500.00 |     30 |
    |  7566 | JONES  | MANAGER   | 7839 | 1981-04-02 | 2975.00 |    NULL |     20 |
    |  7654 | MARTIN | SALESMAN  | 7698 | 1981-09-28 | 1250.00 | 1400.00 |     30 |
    |  7698 | BLAKE  | MANAGER   | 7839 | 1981-05-01 | 2850.00 |    NULL |     30 |
    |  7782 | CLARK  | MANAGER   | 7839 | 1981-06-09 | 2450.00 |    NULL |     10 |
    |  7788 | SCOTT  | ANALYST   | 7566 | 1987-04-19 | 3000.00 |    NULL |     20 |
    |  7839 | KING   | PRESIDENT | NULL | 1981-11-17 | 5000.00 |    NULL |     10 |
    |  7844 | TURNER | SALESMAN  | 7698 | 1981-09-08 | 1500.00 |    0.00 |     30 |
    |  7876 | ADAMS  | CLERK     | 7788 | 1987-05-23 | 1100.00 |    NULL |     20 |
    |  7900 | JAMES  | CLERK     | 7698 | 1981-12-03 |  950.00 |    NULL |     30 |
    |  7902 | FORD   | ANALYST   | 7566 | 1981-12-03 | 3000.00 |    NULL |     20 |
    |  7934 | MILLER | CLERK     | 7782 | 1982-01-23 | 1300.00 |    NULL |     10 |
    +-------+--------+-----------+------+------------+---------+---------+--------+

2、将查询结果插入到一张表当中?insert相关的


    //将查询结果创建成表
    creat table dept_bak as select * from dept;
    //将查询结果插入到表
    insert into dept_bak select * from dept;

3、快速删除表中的数据?【重要】 truncate


    //删除dept_bak表中的数据
    delete from dept_bak;

    delete语句删除数据的原理?(delete属于DML语句)
        表中的数据被删除了,但是这个数据在硬盘上的真实存储空间不会被释放
        这种删除的缺点是:删除效率比较低
        这种删除的优点是:支持回滚,后悔了可以在恢复数据

    truncate语句删除数据的原理?
        这种删除效率比较高,表被一次截断,物理删除
        这种删除缺点:不支持回滚
        这种删除优点:快速
    
    用法:truncate table dept_bak

    删除表操作?
    drop table 表名;//这不是删除表中的数据,这是把表删除

4、约束(重要)

4.1、什么是约束?


    约束对应的英语单词:constraint
    在创建表的时候,我们可以给表中的字段加上一些约束,来保证这个表中数据的完整性、有效性

    约束的作用就是为了保证:表中的数据有效

4.2、约束包括哪些?


    非空约束:not null
    唯一约束:nuique
    主键约束:primary key
    外键约束:foreign key
    检查约束:check(mysql不支持,oracle支持)

4.3、非空约束:not null


    非空约束not null约束的字段不能为null

    create table t_vip(
    id int,
    name varchar(255) not null
    );

     insert into t_vip values(01,'zhangsan');
     insert into t_vip values(02,'lisi');
     insert into t_vip(id) values(3); //报错
     Field 'name' doesn't have a default value

     小插曲:
        xxx.sql这种文件被称为sql脚本文件
        sql脚本文件中编写了大量的sql语句
        我们执行sql脚本文件的时候,该文件中所有的sql语句会全部执行
        批量的执行sql语句,可以使用sql脚本文件
        在mysql中怎么执行sql脚本呢?
            source 文件拖过来 但一定注意不能有中文

4.4、唯一性约束:unique


    唯一性约束unique约束的字段不能重复,但是可以为null
    drop table if exists t_vip;
    create table t_vip(
        id int,
        name varchar(255) unique,  //unique 添加在列的后面时,这种约束被称为列级约束
        email varchar(255)
    );
    insert into t_vip values(1,'zhangsan','zhangsan@123.com');
    insert into t_vip values(2,'lisi','lisi@123.com');
    insert into t_vip values(3,'wangwu','wangwu@123.com');

    insert into t_vip values(4,'wangwu','wangwu@123.com');
    ERROR 1062 (23000): Duplicate entry 'wangwu' for key 'name'
    //unique不能重复 但是可以为null
    insert into t_vip(id) values(4);

    mysql> select * from t_vip;
    +------+----------+------------------+
    | id   | name     | email            |
    +------+----------+------------------+
    |    1 | zhangsan | zhangsan@123.com |
    |    2 | lisi     | lisi@123.com     |
    |    3 | wangwu   | wangwu@123.com   |
    |    4 | NULL     | NULL             |
    +------+----------+------------------+


    新需求:name和email两个字段联合起来具有唯一性!!!
    意思是 只有name和email不同时相等 就可以插入进去数据

    drop table if exists t_vip;
    create table t_vip(
        id int,
        name varchar(255),
        email varchar(255),
        unique(name,email)    没有添加到列的后面,这种约束被称为表级约束
    );

    insert into t_vip values(1,'zhangsan','zhangsan@123.com');
    insert into t_vip values(2,'zhangsan','zhangsan@qq.com');

    //ERROR 1062 (23000): Duplicate entry 'zhangsan-zhangsan@qq.com' for key 'name'
    insert into t_vip values(3,'zhangsan','zhangsan@123.com');

    什么时候使用表级约束呢?


        需要给多个字段联合起来添加某一个约束的时候,需要使用表级约束

    unique可以和not null 联合吗
     drop table if exists t_vip;
     create table t_vip(id int,name varchar(255) not null unique);
     mysql> desc t_vip;
    +-------+--------------+------+-----+---------+-------+
    | Field | Type         | Null | Key | Default | Extra |
    +-------+--------------+------+-----+---------+-------+
    | id    | int(11)      | YES  |     | NULL    |       |
    | name  | varchar(255) | NO   | PRI | NULL    |       |
    +-------+--------------+------+-----+---------+-------+
    

    在mysql当中,如果一个字段同时被not null 和unique约束的话,该字段自动编程主键字段
    (注意:oracle中不一样 )

4.5、主键约束(primary key,简称PK)非常重要

    主键约束的相关属于?
        主键约束:就是一种约束
        主键字段:该字段上添加了主键约束,这样的字段就叫做主键字段
        主键值:主键字段中的每一个值都叫做:主键值

    什么是主键?有什么用
        主键值是每一行记录的唯一标识
        主键值是每一行记录的身份证号

    记住:任何一张表都应该有主键,没有主键,表无效

    主键的特征:not null + unique(主键值不能是null,同时也不能重复)

    怎么给字段设置主键呢?
        drop table if exists t_vip;
        create table t_vip(
            id int primary key,
            name varchar(255)
        );

        insert into t_vip(id,name) values(1,'zhangsan');
        insert into t_vip(id,name) values(2,'zhangsan');

        //报错
        insert into t_vip(id,name) values(2,'zhangsan');
        ERROR 1062 (23000): Duplicate entry '2' for key 'PRIMARY'

        使用表及约束添加主键可以吗?
        drop table if exists t_vip;
        create table t_vip(
            id int ,
            name varchar(255),
            primary key(id,name)
        );

        insert into t_vip(id,name) values(1,'zhangsan');
        insert into t_vip(id,name) values(2,'zhangsan');
        insert into t_vip(id,name) values(2,'lisi');
        insert into t_vip(id) values(2);

    在实际开发中不建议使用:符合主键。建议使用单一主键
    复合主键比较复杂,不建议使用

    一个表中主键只能有一个,不能出现多个

    主键除了:单一主键和复合主键之外,还额可以这样进行分类?
        自然主键:主键值是一个自然数,和业务没关系
        业务主键:主键值和业务紧密关联,例如拿银行卡账号做主键值,这就是业务主键

    在实际开发中使用业务主键比较多,还是使用自然主键多一些呢?
        自然主键使用比较好,因为主键只要做到不重复就行,不需要有意义
        业务主键不好,因为主键一旦和业务挂钩,那么当业务发生变动的时候,可能会影响到主键值,所以业务
        主键不建议使用。尽量使用自然主键

    在mysql中有一种机制,可以帮助我们自动维护一个主键值?


        drop table if exists t_vip;
        create table t_vip(
            id int primary key auto_increment,
            name varchar(255)
        );

        insert into t_vip(name) values('zhangsan');
        insert into t_vip(name) values('zhangsan');
        insert into t_vip(name) values('zhangsan');
        insert into t_vip(name) values('zhangsan');
        +----+----------+
        | id | name     |
        +----+----------+
        |  1 | zhangsan |
        |  2 | zhangsan |
        |  3 | zhangsan |
        |  4 | zhangsan |
        +----+----------+


4.5、外键约束


    
    * 关于外键约束的相关术语:
        外键约束: foreign key
        外键字段:添加有外键约束的字段
        外键值:外键字段中的每一个值。
    
    * 业务背景:
        请设计数据库表,用来维护学生和班级的信息?
            第一种方案:一张表存储所有数据
            no(pk)            name            classno            classname
            -------------------------------------------------------------------------------------------
            1                    zs1                101                北京大兴区经济技术开发区亦庄二中高三1班
            2                    zs2                101                北京大兴区经济技术开发区亦庄二中高三1班
            3                    zs3                102                北京大兴区经济技术开发区亦庄二中高三2班
            4                    zs4                102                北京大兴区经济技术开发区亦庄二中高三2班
            5                    zs5                102                北京大兴区经济技术开发区亦庄二中高三2班
            缺点:冗余。【不推荐】

            第二种方案:两张表(班级表和学生表)
            t_class 班级表
            cno(pk)        cname
            --------------------------------------------------------
            101        北京大兴区经济技术开发区亦庄二中高三1班
            102        北京大兴区经济技术开发区亦庄二中高三2班

            t_student 学生表
            sno(pk)        sname                classno(该字段添加外键约束fk)
            ------------------------------------------------------------
            1                zs1                101
            2                zs2                101
            3                zs3                102
            4                zs4                102
            5                zs5                102
        
    * 将以上表的建表语句写出来:

        t_student中的classno字段引用t_class表中的cno字段,此时t_student表叫做子表。t_class表叫做父表。

        顺序要求:
            删除数据的时候,先删除子表,再删除父表。
            添加数据的时候,先添加父表,在添加子表。
            创建表的时候,先创建父表,再创建子表。
            删除表的时候,先删除子表,在删除父表。
        
        drop table if exists t_student;
        drop table if exists t_class;

        create table t_class(
            cno int,
            cname varchar(255),
            primary key(cno)
        );

        create table t_student(
            sno int,
            sname varchar(255),
            classno int,
            primary key(sno),
            foreign key(classno) references t_class(cno)
        );

        insert into t_class values(101,'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');
        insert into t_class values(102,'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy');

        insert into t_student values(1,'zs1',101);
        insert into t_student values(2,'zs2',101);
        insert into t_student values(3,'zs3',102);
        insert into t_student values(4,'zs4',102);
        insert into t_student values(5,'zs5',102);
        insert into t_student values(6,'zs6',102);
        select * from t_class;
        select * from t_student;

        insert into t_student values(7,'lisi',103);
        ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`bjpowernode`.INT `t_student_ibfk_1` FOREIGN KEY (`classno`) REFERENCES `t_class` (`cno`))

    * 外键值可以为NULL?
        外键可以为NULL。
    
    * 外键字段引用其他表的某个字段的时候,被引用的字段必须是主键吗?
        注意:被引用的字段不一定是主键,但至少具有unique约束。

5、存储引擎(了解)


5.1、什么是存储引擎,有什么用呢?


    存储引擎是mysql中特有的一个术语,其他数据库中没有。(Oracle中有,但是不叫这个名字)
    实际上存储引擎是一个表存储/组织数据的方式。
    不同的存储引擎,表存储数据的方式不同

    使用:show create table 表名;  
    来查看表的存储引擎


    | t_vip | CREATE TABLE `t_vip` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(255) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 |

    在创建表的时候 我们可以在最后面的小括号输入:
    engine = InnoDB default charset = utf8;
    engine是来指定存储引擎
    charset来指定这张表的字符编码方式

    结论:
        mysql默认的存储引擎是InnoDB
        mysql默认的字符编码方式是:utf8

5.2、怎么查看mysql支持哪些存储引擎呢?


    show engines \G
    *************************** 1. row ***************************
      Engine: FEDERATED
     Support: NO
     Comment: Federated MySQL storage engine
    Transactions: NULL
          XA: NULL
      Savepoints: NULL
    *************************** 2. row ***************************
          Engine: MRG_MYISAM
         Support: YES
         Comment: Collection of identical MyISAM tables
    Transactions: NO
          XA: NO
      Savepoints: NO
    *************************** 3. row ***************************
          Engine: MyISAM
         Support: YES
         Comment: MyISAM storage engine
    Transactions: NO
          XA: NO
      Savepoints: NO
    *************************** 4. row ***************************
          Engine: BLACKHOLE
         Support: YES
         Comment: /dev/null storage engine (anything you write to it disappears)
    Transactions: NO
          XA: NO
      Savepoints: NO
    *************************** 5. row ***************************
          Engine: CSV
         Support: YES
         Comment: CSV storage engine
    Transactions: NO
          XA: NO
      Savepoints: NO
    *************************** 6. row ***************************
          Engine: MEMORY
         Support: YES
         Comment: Hash based, stored in memory, useful for temporary tables
    Transactions: NO
          XA: NO
      Savepoints: NO
    *************************** 7. row ***************************
          Engine: ARCHIVE
         Support: YES
         Comment: Archive storage engine
    Transactions: NO
          XA: NO
      Savepoints: NO
    *************************** 8. row ***************************
          Engine: InnoDB
         Support: DEFAULT
         Comment: Supports transactions, row-level locking, and foreign keys
    Transactions: YES
          XA: YES
      Savepoints: YES
    *************************** 9. row ***************************
          Engine: PERFORMANCE_SCHEMA
         Support: YES
         Comment: Performance Schema
    Transactions: NO
          XA: NO
      Savepoints: NO


5.3、关于mysql常用的存储引擎介绍一下

myisam存储引擎?
    他管理的表具有一下特征:
        使用三个文件表示每个表:
            格式文件 - 存储表结构的定义(mytable.frm)
            数据文件 - 存储表行的内容(mytable.MYD)
            索引文件 - 存储表上索引(mytable.MYI):索引是一本书的目录,缩小扫描范围,提高效率
        可被转换为压缩、只读表来节省空间

        对于一张表来说,只要是主键或者加有unique约束的字段会自动创建索引

        MyISAM存储引擎特点:
            可被转换为压缩,只读表来节省空间
            这是这种存储引擎的优势

InnoDB存储引擎?
    这是mysql默认的存储引擎,同时也是一个重量级的存储引擎
    InnoDB支持事物,支持数据可崩溃后自动回复机制
    InnoDB存储引擎最主要的特点是:非常安全

    InnoDB最大的特点就是支持事务:
        以保证数据的安全。效率不是很高,并且也不能压缩,不能转换为只读
        不能很好的节省存储空间

MEMORY存储引擎?
    使用MEMORY存储引擎的表,其数据存储在内存中,且行的长度固定,这两个特点
    使得MEMORY存储引擎非常快

    MEMORY存储引擎管理的表具有下列特征:
        在数据库目录内,每个表均以.frm格式的文件表示
        表数据及索引被存储在内存中。(目的就是快)
        表级锁机制
        不能包含TEXT或BLOB字段
    
    MEMORY存储引擎以前被称为HEAP引擎

    MEMORY引擎优点:查询效率是最高的。不需要和硬盘交互
    MEMORY引擎缺点:不安全,关机之后数据消失。因为数据和索引都是在内存当中


6、事物(重点,必须理解)

6.1、什么是事物?


    一个事物其实就是一个完整的业务逻辑。
    是一个最小的工作单元。不可再分

    什么是一个完整的业务逻辑?
        假设转账,从A账户向B账户中转账10000
        将A账户的钱减去10000(uptate语句)
        将B账户的钱加上10000(uptate语句)
        这就是一个完整的业务逻辑。

        以上的操作是最小的工作单元,要么同时成功,要么同时失败,不可再分
        这两个uptate语句要求必须同时成功或者同时失败

6.2、只有DML语句才会有事务这一说,其他语句和事务无关!!!


    insert
    delete
    update
    只有以上三个语句和事务有关系,其他的都没有关系

    因为只有以上的三个语句是数据库表中的数据进行增、删、改的
    只要你的操作一旦涉及到数据的增、删、改,那么就一定要考虑安全问题

    数据安全放在第一位

6.3、假设所有的业务,只要一条DML语句就能完成,还有必要存在事物机制吗?


    正是因为要做某件事的时候,需要多条DML语句共同联合起来才能完成
    所有需要事物的存在。如果任何一件复杂的事都能一条DML语句搞定,那么
    事物就没有存在的价值了

    到底什么是事务呢?
        说到底,说到本质上,一个事物其实就是多条DML语句同时成功,同时失败。

    事物:就是批量的DML语句同时成功,或者同时失败

6.4、事务是怎么做到多条DML语句同时成功和同时失败的呢?


    
    InnoDB存储引擎:提供一组用来记录事务性活动的日志文件

    事务开启了:
    insert
    insert
    delete
    update
    insert
    update
    事务结束了

    在事务的执行过程中,每一条DML的操作都会记录到“事务性活动的日志文件”中
    在事务的执行过程中,我们可以提交事务,也可以回滚事务。

    提交事务?
        清空事务性活动的日志文件,将数据全部彻底持久化到数据库表中
        提交事务标志着,事务的结束。并且是一种全部成功的结束

    回滚事务?
        将之前所有的DML操作全部撤销,并且清空事务性活动的日志文件
        回滚事务标志着,事务的结束,并且是一种全部失败的结束

6.5、怎么提交事务,怎么回滚事务?


    提交事务:rommit; 语句
    回滚事务:rollback;

    事务对应的英语单词是:transaction

    测试一下,在mysql当中默认的事务行为是怎么样的?
        mysql默认情况下是支持自动提交事务的。(自动提交)
        什么是自动提交?
            每执行一条DML语句,就提交一次

    怎么将mysql的自动提交机制关闭掉呢?
        先执行这个命令:start transaction;

    演示事务:
    ------------------------------回滚事务-------------------------
    mysql> show tables;
    +-----------------+
    | Tables_in_zheng |
    +-----------------+
    | dept            |
    | dept_bak        |
    | emp             |
    | emp2            |
    | salgrade        |
    | t_protect       |
    | t_user          |
    | t_vip           |
    +-----------------+
    8 rows in set (0.01 sec)

    mysql> select * from emp2;
    +-------+--------+-----------+------+------------+---------+---------+--------+
    | EMPNO | ENAME  | JOB       | MGR  | HIREDATE   | SAL     | COMM    | DEPTNO |
    +-------+--------+-----------+------+------------+---------+---------+--------+
    |  7369 | SMITH  | CLERK     | 7902 | 1980-12-17 |  800.00 |    NULL |     20 |
    |  7499 | ALLEN  | SALESMAN  | 7698 | 1981-02-20 | 1600.00 |  300.00 |     30 |
    |  7521 | WARD   | SALESMAN  | 7698 | 1981-02-22 | 1250.00 |  500.00 |     30 |
    |  7566 | JONES  | MANAGER   | 7839 | 1981-04-02 | 2975.00 |    NULL |     20 |
    |  7654 | MARTIN | SALESMAN  | 7698 | 1981-09-28 | 1250.00 | 1400.00 |     30 |
    |  7698 | BLAKE  | MANAGER   | 7839 | 1981-05-01 | 2850.00 |    NULL |     30 |
    |  7782 | CLARK  | MANAGER   | 7839 | 1981-06-09 | 2450.00 |    NULL |     10 |
    |  7788 | SCOTT  | ANALYST   | 7566 | 1987-04-19 | 3000.00 |    NULL |     20 |
    |  7839 | KING   | PRESIDENT | NULL | 1981-11-17 | 5000.00 |    NULL |     10 |
    |  7844 | TURNER | SALESMAN  | 7698 | 1981-09-08 | 1500.00 |    0.00 |     30 |
    |  7876 | ADAMS  | CLERK     | 7788 | 1987-05-23 | 1100.00 |    NULL |     20 |
    |  7900 | JAMES  | CLERK     | 7698 | 1981-12-03 |  950.00 |    NULL |     30 |
    |  7902 | FORD   | ANALYST   | 7566 | 1981-12-03 | 3000.00 |    NULL |     20 |
    |  7934 | MILLER | CLERK     | 7782 | 1982-01-23 | 1300.00 |    NULL |     10 |
    +-------+--------+-----------+------+------------+---------+---------+--------+
    14 rows in set (0.01 sec)

    mysql> start transaction;
    Query OK, 0 rows affected (0.00 sec)

    mysql> delete from emp2;
    Query OK, 14 rows affected (0.00 sec)

    mysql> select * from emp2;
    Empty set (0.00 sec)

    mysql> insert into emp2 values(1111,'aaa','aaa',2222,'1984-1-5',744,0,10);
    Query OK, 1 row affected (0.00 sec)

    mysql> select * from emp2;
    +-------+-------+------+------+------------+--------+------+--------+
    | EMPNO | ENAME | JOB  | MGR  | HIREDATE   | SAL    | COMM | DEPTNO |
    +-------+-------+------+------+------------+--------+------+--------+
    |  1111 | aaa   | aaa  | 2222 | 1984-01-05 | 744.00 | 0.00 |     10 |
    +-------+-------+------+------+------------+--------+------+--------+
    1 row in set (0.00 sec)

    mysql> rollback;
    Query OK, 0 rows affected (0.00 sec)

    mysql> select * from emp2;
    +-------+--------+-----------+------+------------+---------+---------+--------+
    | EMPNO | ENAME  | JOB       | MGR  | HIREDATE   | SAL     | COMM    | DEPTNO |
    +-------+--------+-----------+------+------------+---------+---------+--------+
    |  7369 | SMITH  | CLERK     | 7902 | 1980-12-17 |  800.00 |    NULL |     20 |
    |  7499 | ALLEN  | SALESMAN  | 7698 | 1981-02-20 | 1600.00 |  300.00 |     30 |
    |  7521 | WARD   | SALESMAN  | 7698 | 1981-02-22 | 1250.00 |  500.00 |     30 |
    |  7566 | JONES  | MANAGER   | 7839 | 1981-04-02 | 2975.00 |    NULL |     20 |
    |  7654 | MARTIN | SALESMAN  | 7698 | 1981-09-28 | 1250.00 | 1400.00 |     30 |
    |  7698 | BLAKE  | MANAGER   | 7839 | 1981-05-01 | 2850.00 |    NULL |     30 |
    |  7782 | CLARK  | MANAGER   | 7839 | 1981-06-09 | 2450.00 |    NULL |     10 |
    |  7788 | SCOTT  | ANALYST   | 7566 | 1987-04-19 | 3000.00 |    NULL |     20 |
    |  7839 | KING   | PRESIDENT | NULL | 1981-11-17 | 5000.00 |    NULL |     10 |
    |  7844 | TURNER | SALESMAN  | 7698 | 1981-09-08 | 1500.00 |    0.00 |     30 |
    |  7876 | ADAMS  | CLERK     | 7788 | 1987-05-23 | 1100.00 |    NULL |     20 |
    |  7900 | JAMES  | CLERK     | 7698 | 1981-12-03 |  950.00 |    NULL |     30 |
    |  7902 | FORD   | ANALYST   | 7566 | 1981-12-03 | 3000.00 |    NULL |     20 |
    |  7934 | MILLER | CLERK     | 7782 | 1982-01-23 | 1300.00 |    NULL |     10 |
    +-------+--------+-----------+------+------------+---------+---------+--------+


------------------------------提交事务--------------------------------------

    mysql> start transaction;
    Query OK, 0 rows affected (0.00 sec)

    mysql> select * from emp2;
    +-------+--------+-----------+------+------------+---------+---------+--------+
    | EMPNO | ENAME  | JOB       | MGR  | HIREDATE   | SAL     | COMM    | DEPTNO |
    +-------+--------+-----------+------+------------+---------+---------+--------+
    |  7369 | SMITH  | CLERK     | 7902 | 1980-12-17 |  800.00 |    NULL |     20 |
    |  7499 | ALLEN  | SALESMAN  | 7698 | 1981-02-20 | 1600.00 |  300.00 |     30 |
    |  7521 | WARD   | SALESMAN  | 7698 | 1981-02-22 | 1250.00 |  500.00 |     30 |
    |  7566 | JONES  | MANAGER   | 7839 | 1981-04-02 | 2975.00 |    NULL |     20 |
    |  7654 | MARTIN | SALESMAN  | 7698 | 1981-09-28 | 1250.00 | 1400.00 |     30 |
    |  7698 | BLAKE  | MANAGER   | 7839 | 1981-05-01 | 2850.00 |    NULL |     30 |
    |  7782 | CLARK  | MANAGER   | 7839 | 1981-06-09 | 2450.00 |    NULL |     10 |
    |  7788 | SCOTT  | ANALYST   | 7566 | 1987-04-19 | 3000.00 |    NULL |     20 |
    |  7839 | KING   | PRESIDENT | NULL | 1981-11-17 | 5000.00 |    NULL |     10 |
    |  7844 | TURNER | SALESMAN  | 7698 | 1981-09-08 | 1500.00 |    0.00 |     30 |
    |  7876 | ADAMS  | CLERK     | 7788 | 1987-05-23 | 1100.00 |    NULL |     20 |
    |  7900 | JAMES  | CLERK     | 7698 | 1981-12-03 |  950.00 |    NULL |     30 |
    |  7902 | FORD   | ANALYST   | 7566 | 1981-12-03 | 3000.00 |    NULL |     20 |
    |  7934 | MILLER | CLERK     | 7782 | 1982-01-23 | 1300.00 |    NULL |     10 |
    +-------+--------+-----------+------+------------+---------+---------+--------+
    14 rows in set (0.00 sec)

    mysql> detele from emp2 ;
    ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'detele from emp2' at line 1
    mysql> delete from emp2 ;
    Query OK, 14 rows affected (0.00 sec)

    mysql> select * from emp2;
    Empty set (0.00 sec)

    mysql> commit;
    Query OK, 0 rows affected (0.00 sec)

    mysql> select * from emp2;
    Empty set (0.00 sec)

    mysql> rollback;
    Query OK, 0 rows affected (0.00 sec)

    mysql> select * from emp2;
    Empty set (0.00 sec)

6.6、事务包括四个特性?(重要)


    A:原子性:
        说明事务是最小的工作单元,不可再分
    
    C:一致性:
        所有事务要求,在同一个事务当中,所有操作必须同时成功,或者同时失败
        以保证数据的安全性

    I:隔离性:
        A事务和B事务之间具有一定的隔离
        教室A和教室B之间有一道墙,这道墙就是隔离性
        A事务在操作一张表的时候,另一个事务B也操作这张表会怎么样?

    D:持久性:
        事务最终结束的一个保证。事务提交,就相当于将没有保存到硬盘上的数据保存到硬盘上


6.7、重点研究一下事务的隔离性!!!


    A教室和B教室中间有一道墙,这道墙可以很厚,也可以很薄。这就是事务的隔离级别
    这道墙越厚,表示隔离级别就越高

    事务和事务之间的隔离级别有哪些呢?
        读未提交:read uncommitted(最低的隔离级别)《没有提交就读取到了》
            什么是读未提交?
                事务A可以读取事务B还没有提交的数据
            这种隔离级别存在的问题就是:
                脏读现象(Dirty read)
                我们称为脏数据
        
        读已提交:read committed《提交之后才可以读取到》
            什么是读已提交?
                事务A可以读取事务B已经提交的数据
            这种隔离级别解决了什么问题?
                解决了脏读现象
            这种隔离级别存在什么问题?
                不可重复读取数据
                什么是不可重复读取数据呢?
                    在事务开启之后,第一次读取到的数据是3条,当前事务还没有结束
                    可能第二次在读取的时候,读到的数据就是4条了,3不等于4,称为
                    不可重复读取(就是事务B在执行的时候读取了两次A事务中的数据,
                    事务A可能变化了多次,数据也就不一样了)

                这种隔离级别是比较真实的数据,每一次读到的数据是绝对的真实
                oracle数据库默认的隔离级别是:read committed

        可重复读:repeatable read《提交之后也读不到,永远读取的都是刚开启事务时的数据》
            什么是可重复读取?
                事务A开启之后,不管是多久,每一次事务A读取到的数据都是一致的,即使事务B将数据
                已经修改,并且提交了,事务A读取到的数据还是没有发生改变,这就是可重复读
            可重复读解决了什么问题呢?
                解决了不可重复读取数据
            可重复读存在的问题是什么?
                可能会出现幻影读
                每一次读取到的数据都是幻象。不够真实

            早晨9点开始开启了事务,只要事务不结束,到晚上9点,读到的数据还是那样

        例子:比如银行要进行总账,执行过程从1点到3点结束,如果中途有人存取钱的话,数据就不正确了,所以使用
        可重复读,,事务A进行读取总账,事务B进行存取钱,事务A的数据一直都是1点那个数据,事务B进行提交了,事务A
        也不变化,而读已提交就不行,他会将数据进行更新,对应出现的问题是:不可重复读取数据 


        序列化/串行化:serializable(最高的隔离级别):
            这是最高隔离级别,效率最低。解决了所有的问题
            这种级别表示事务排队,不能并发
            每一次读取到的数据都是最真实的,并且效率是最低的

6.8、验证各种隔离级别

查看隔离级别:select @@tx_isolation;
    +-----------------+
    | @@tx_isolation  |
    +-----------------+
    | REPEATABLE-READ |
    mysql中默认的隔离级别

验证:read uncommit

设置全局的隔离级别:set global transaction isolation level read uncommitted;
改完之后退出一下重新进入
事务A                    事务B
--------------------------------------------------------------------------------------------
use zheng;
                        use zheng;
start transaction;
select * from t_user;
                        start transaction;
                        insert into t_user values('zhangsan');
select * from t_user;

验证:read committed

设置全局的隔离级别:set global transaction isolation level read committed;
改完之后退出一下重新进入
事务A                    事务B
--------------------------------------------------------------------------------------------
use zheng;
                        use zheng;
start transaction;
                        start transaction;
select * from t_user;
                        insert into t_user values('zhangsan');
select * from t_user;    
                        commit;
select * from t_user;


验证:repeatable read

设置全局的隔离级别:set global transaction isolation level repeatable read;
改完之后退出一下重新进入
事务A                    事务B
--------------------------------------------------------------------------------------------
use zheng;
                        use zheng;
start transaction;
                        start transaction;
select * from t_uesr;
                        insert into t_uesr values('lisi');
                        insert into t_uesr values('wangwu');
select * from t_user;
                        commit;
select * from t_user;


验证:serializable

设置全局的隔离级别:set global transaction isolation level repeatable read;
改完之后退出一下重新进入
事务A                    事务B
--------------------------------------------------------------------------------------------
use zheng;
                        use zheng;
start transaction;
                        start transaction;
select * from t_uesr;
insert into t_user values('abc');
                        select *from t_user;

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/200018
推荐阅读
相关标签
  

闽ICP备14008679号