mysql数据库:表的创建/删除/数据插入/修改/删除/表结构增删改/约束/存储引擎/事务 (老杜)

目录

一、表的创建create(DDL)

二、删除表:drop(DDL)

三、数据的插入:insert (DML)

四、数据的修改:(DML)

五、数据的删除

六、数据类型(总结的一些问题)

七、表结构的增删改alter(DDL)(较少用)

八、约束(☆☆☆☆☆)

九、存储引擎

十、事务(☆☆☆☆☆,必须掌握)


一、表的创建create(DDL)

    1.1 格式:
        格式1:
        create table ____(表名) (字段名 字段型,字段名 字段型,字段名 字段型.....)
        格式2:
        create table_____(表名)(
        字段名 字段型,
        字段名 字段型,
        ......
        );
        注释:table 表名命名格式通常 t_.....或者tbel_开始,增强可读性。

    1.2所属类别:
        DDL数据定义语句,包括create drop alter 

    1.3mysql数据类型
        1)varchar(字符串长度)
            可变长度的字符串
            最长255
            优点:节约空间,智能,根据输入字符串长度自动分配空间。
            缺点:速度慢,需要将长度匹配后才能够生效。

        2)char(字符串长度)
            定长字符串
            最长255
            优点:高效速度快。
            缺点:固定长度,使用不当浪费存储空间。

        3)int
            数字中的整型
            最长(默认)11

        4)bigint
            数字中的长整型;等同于Java中的long。

        5)float
            单精度浮点型数据

        6)double
            双精度浮点型数据

        7)date
            短日期类型

        8)datetime
            长日期类型

        9)clob
            Character Large OBject 
            字符大对象
            超过255字符串的使用clob
            最多存储4g的字符串
            存储说明、文字、文章类型

        10)blob
            Binary Large OBject 
            二进制大对象
            需要利用io流
            存储视频、图片、音频流媒体类型数据

    1.4案例使用:

        1.4.1电影信息存储表

        编号        电影名                            上映时间            放映时长                    概要            海报            影片类型
        (no int)    (name varchar)        (uptime date)        (times double)        (story clob)    (pic blob)        (char)
        --------------------------------------------------------------------------------------------------------------------------------------------------
        0000        指环王                            2020-10-1            1.5h                        ............        png            1
        0001        哪吒                                2020-10-1            1.5h                        ............        png            1
        ...

                  学生信息存储表

    1.5创建表:DDL
        学号 姓名 年龄性别 邮箱地址
            create table t_student(
            Stuno int,
            name varchar(32)
            age int(3)
            six char(1)
            email varchar(255)
            );
            +-------+--------------+------+-----+---------+-------+
            | Field | Type         | Null | Key | Default | Extra |
            +-------+--------------+------+-----+---------+-------+
            | stuno | int          | YES  |     | NULL    |       |
            | name  | varchar(32)  | YES  |     | NULL    |       |
            | six   | int          | YES  |     | NULL    |       |
            | email | varchar(255) | YES  |     | NULL    |       |
            +-------+--------------+------+-----+---------+-------+

        注释:表名、字段名可以输入中文,且不用加入引号。

        创建表且添加参数:(待补充)

        

二、删除表:drop(DDL)

        2.1删除:drop table t_student;drop table if exists asd;
            注释:如果表不存在,删除表会报错
        2.2若存删除:drop if exists table t_student;
             注释:如果表存在,删除表不会报错

三、数据的插入:insert (DML)

        mysql> select *from t_student;
        +------+----------+------+------+--------+
        | no     | name      | six    | age  | email  |
        +------+----------+------+------+--------+
        |    1    | zhangsan  | f     |   19 | zs@123 |
        | NULL  | NULL      | m      | NULL | NULL   |
        |    2    | lisi         | m      |   20 | ls@123 |
        | NULL  | zhu        | NULL |   21 | NULL    |
        |    3    | lisi         | m    |   20 | ls@123   |
        +------+----------+------+------+--------+

        法一:全部书写;(推荐格式)
        insert into ___(表名) ____(字段1,字段2,...)value(value1,value2,value3...);
        案例:
        insert into t_student(Stuno,name,age,six,email)value(01,'zhangsan',18,'f','zs@123');
        注释:
        值类型为int型如果填入01,显示的值自动修改为1,类推,若需保留,需要改为字符串型。

        法二:部分书写;
        insert into____(表名)(字段N)values(valueN);
        insert into t_student(name,email)('lisi','ls@123')
        注释:
        没填的值默认为空NULL,insert执行完成一次形成新的一条语句,无法用insert语句向已执行的语句中增改内容。
        字段可以任意更换位置,后面的值相互对应。
        
        法三:字段全略;
        insert into t_student()values(03,'zhangsan',18,'f','zs@123');
        insert into t_student value(03,'lisi','m',20,'ls@123');
        注释:
        前面全部省略等价于字段全部写了,
        每个语法之间打空格不影响使用,
        表格后面括号是否替换为空格不影响使用。

        法四:修改默认值default;
        语法:default '修改值'
        注释:在创建表之前写好
        drop table if exists t_student;
        create table t_student(
        stuno int,
        name varchar(32),
        age int(3),
        six char(1) default 'f',
        email varchar(255),
        );
            
    3.1日期的插入:insert (DML)
        
        长日期:date(%Y-%m-%d)
        短日期:datetime(%Y-%m-%d %h:%i:%s)

        3.1.1数字化格式:format(字段,‘$999,999’)
            select * format(sal,'$999,999') from emp;

        3.1.2str_to_date:varchar字符串转化为日期格式(短日期)
            
            格式一:str_to_date('需要转化的字符串','转化后的格式')
            insert into t_student(name,no,birth)value('zhangsan','1',str_to_date('01-03-1989','%d-%m-%Y'));
            insert into t_student() value(5,'xiaohei','f',21,'xhei@123',str_to_date('01/09/2021','%d/%m/%Y'));
            注释:格式照着前面已有的抄就成;
                无论原有的格式中间间隔是什么符号,最终转化后都会统一为中间是连字符的格式;
            mysql> insert into t_student() value(5,'xiaohei','f',21,'xhei@123',str_to_date('01/09/2021','%d/%m/%Y'));
            +------+----------+------+------+----------+------------+
            | no   | name     | six  | age  | email    | birth      |
            +------+----------+------+------+----------+------------+
            |    1 | zhangsan | f    |   19 | zs@123   | NULL       |
            | NULL | NULL     | m    | NULL | NULL     | NULL       |
            |    2 | lisi     | m    |   20 | ls@123   | NULL       |
            | NULL | zhu      | NULL |   21 | NULL     | NULL       |
            |    3 | lisi     | m    |   20 | ls@123   | NULL       |
            |    4 | xiaohong | m    |   21 | xh@123   | 2021-08-01 |
            |    5 | xiaohei  | f    |   21 | xhei@123 | 2021-09-01 |
            +------+----------+------+------+----------+------------+
            
            格式二:%Y-%m-%d(中间什么符号都可,打引号就好)
            insert into t_student ()value(6,'xiaobai','f',20,'xb@123','2019-12-12');
             insert into t_student()value(7,'xiaozi','f',16,'xz@123','2012$12$13');
            注释:字符串若是格式二,则可省略srt_to_date的函数;
            +------+----------+------+------+----------+------------+
            | no   | name     | six  | age  | email    | birth      |
            +------+----------+------+------+----------+------------+
            |    6 | xiaobai  | f    |   20 | xb@123   | 2019-12-12 |
            |    7 | xiaozi   | f    |   16 | xz@123   | 2012-12-13 |
            |    7 | xiaozi   | f    |   16 | xz@123   | 2012-12-13 |
            +------+----------+------+------+----------+------------+
            问题:输入了两条语句除开date部分中间的连字符输入不同依旧成功插入数据库,与数据库的无相同记录的要求相违背?
                实验一:只输入名称其他参数相同情况下在mysql80中将此纪录可插入两遍?
            批注:麻了,奇怪

            解答:数据库的要求是输入数据过程当中,数据库管理员操作控制的,比如unique,primary key,not null
            
            使用场所:
            通常放置在insert语句种;
            +------+----------+------+------+----------+------------+
            | no   | name     | six  | age  | email    | birth      |
            +------+----------+------+------+----------+------------+
            |    6 | xiaobai  | f    |   20 | xb@123   | 2019-12-12 |
            +------+----------+------+------+----------+------------+
            批注:因此使用date存储日期的时候存入'%Y-%m-%d',date会默认将字符串转化为date日期格式;
        
        a)mysql的日期格式:
              %Y        年
              %m        月
              %d        日
              %h        时
              %i        分
              %s        秒

        3.1.3date_to_str:日期转化为varchar格式;

            查询时换为某个日期设置展示格式:
            date_format('需要修改的数据','目标的日期格式')
            使用场景:select函数种;
            select no,name,date_format(birth,'%Y*%m*%d') form t_student;
            注释:中间什么符号都能加,前提是记得打引号;
        
        3.1.4长日期格式的获取:now()
            增加字段create_time格式为长日期格式;
             insert into t_student() value(9,'assd','f',23,'dfd@123','2001#12#21','2012-12-12 12:30:21');
             insert into t_student()value(8,'asdf','m',21,'asd@123','2012-12-12',now());
        
    3.2insert多条记录一次插入:(常用)
        语法:insert into t_student (no,name,birth)value(1,'zhu',no()),(2,'niu',no()),()...

    3.3快速创建表(表的复制):
        create table emp2 as select * from emp;

    3.4将查询到的记录插入到某张表内;
        insert into emp2 select * from emp;//用的少
        insert into emp2 select name,no,birth from emp;
        注释:搜索的字段数量需要等于待插入数据的字段

    3.5快速删除表中的数据

        3.5.1可回滚删除delete(DML)
            delete from t_student; 
            rollback

        3.5.2不可恢复删除truncate(DDL )
            truncate table t_student; 
        

    1.4.n页面版本软件的应用
        P70    待定;

四、数据的修改:(DML)

    4.1语法格式:
        update 表名 set 字段1=修改值1,字段2=修改值2 where 限制条件(如:学号=1)
    
    4.2案例:
        exit退出;
        if exists判断
        drop table if exists t_student; 
        mysql> create table t_student(id int,
            -> name varchar(255),
            -> birth date,
            -> create_date datetime);
        mysql> update t_student set name='wangbaoqiang' where id=2;
        +------+--------------+-------+-------------+
        | id   | name         | birth | create_date |
        +------+--------------+-------+-------------+
        |    1 | qiangda      | NULL  | NULL        |
        |    2 | wangbaoqiang | NULL  | NULL        |
        +------+--------------+-------+-------------+
        注释:若未加条件则所有选中字段都会被修改;

五、数据的删除

    5.1delete(DML)

        5.1.1删除整条记录:
            delete from 表名 where 限制条件;
            注释:可回滚rollback//回滚失败,暂时原因未知;
            原有在硬盘存储的空间不会释放;
            缺点:删除效率低
            优点:可恢复;

        5.1.2删除整张表的数据:
            delete from 表名 不加限制条件;

    5.2truncate(DDL)

        语法:truncate table 表名
        优点:截断式删除
        缺点:无法恢复
        注释:需要反复确认表格是否舍弃;

六、数据类型(总结的一些问题)

    insert 无法向数据库内插入blob需要使用io流(不理解)
    数据库的字符集UTF-8
    DOWMs命令窗口的字符集是GBK

七、表结构的增删改alter(DDL)(较少用)

    定义:添加,删除,修改一个字段
    注释:修改成本较高
    不属于java程序员的范畴,设计人员的工作,也可使用工具窗口直接修改。

八、约束(☆☆☆☆☆)

    constraint
    用途:保证数据完整有效性:
    分类:
    非空约束:not null
    唯一性约束:unique
    主键约束:primary key
    外键约束:foregin key
    检查约束:check(mysql无法使用,oracle可用)
    
    8.1非空约束
        not null 约束的字段不能为空

        语法:
        drop table if exists t_student;
        create table t_student(
            id int,
            name varchar(255) not null
            );
        insert into t_student(name)('zhu');

        8.1.1批量执行:

            sql结尾的文件称为脚本文件;
            使用场景:需要一次性执行大量sql语句情况;上级传出的较大文件;
            方法1:source 输入(拖拽)文件路径;
            方法2:cv大法
            不使用法二原因,通常txt文件过大时,打开文本的操作使其崩溃
    
    8.2唯一性约束
        unique约束的字段不可以重复,可为空
            
            8.2.1一字段唯一:

            语法;
            drop table if exists t_student;
            create table t_student(id int,name varchar(255) unique,email varchar);
            insert into insert into t()value(1,'zhu','zhu@123'),(2,'xiao','xiao@123'),(3,'li','li@123');
             insert into t()value(4,'xiao','xi@123');
            ERROR 1062 (23000): Duplicate entry 'xiao' for key 't.name'//字段值重复
            注释:都为null不算重复
        
            8.2.2两字段联合唯一:(不是各自唯一)
            注释:理解为字段各自可重复,但是两字段联合起来的新的“大字段”不可重复
            分类:表级约束、列级约束
            
            列级约束:(约束添加在列后面)
            插入失败方式:
            drop table if exists t ;
            create t (
            id int,
            name varchar(255) unique,
            email varchar(255) unique));
            //非约束目标
            insert into t()value(1,'zhang','asdf@123')
            insert into t()value(2,'san','asdf@123')

            列级约束:
            正确插入:
            drop table if t exists;
            create t(
            id int,
            name varchar(255),
            email varchar(255),
            unique(name,email)
            );
            //约束目标
            insert into t()value(1,'zhang','asdf@123')
            insert into t()value(1,'zhang','asdf@123')
            
            注释:
            not null只有列级约束,没有表级元素,不同于unique;
            
    8.3not nulll与unique 联合使用
        drop table if exists t;
        create t(
        id int,name varchar(255),email varchar(255) not null unique
        );
        注释:若该字段同时被not null 与unique限制,将会变成主键字段;(只在mysql中可行,Oracle不可)

    8.4主键约束primary key,简称pk

        8.4.1主键约束相关术语:
            主键约束:
            主键字段:被约束的字段
            主键值:每行的身份证号;主键字段的每个值
            注释:无主键约束,表无效

        8.4.2特征:不为空,且不重复

        8.4.3添加方式
            分类一:
                单一主键:
                    列级约束
                    drop table if exists t;
                    create t(
                    id int primary key,
                    name varchar(255),
                    email varchar(255));
                    表级约束
                    drop table if exists t;
                    create t(
                    id int ,
                    name varchar(255),
                    email varchar(255),
                    primary key(id));
                复合主键:
                    drop table if exists;
                    create t(
                    id int,
                    name varchar(255),
                    email varchar(255)
                    primary key(id,name)
                    );
                注意:做主键的通常为int,bigint,char
                    varchar此类不定长的不推荐。

                注释:复合主键不推荐,推荐单一主键。
                          主键只存在一个;
            分类二:
                自然主键:
                纯自然数(推荐):
                    与其他数据无关联,修改便捷,成本较小
                复合主键:
                    与存储信息相关的号码,如银行卡卡号

            自动维护主键值:auto_increment
                从1开始自动递增

                drop table if exists t;
                create table t(
                id int primary key auto_increment,
                name varchar(255)
                );
                insert into t(name)('zhangsan');
                insert into t(name)('zhangsan');
                insert into t(name)('zhangsan');
                (p95工具的使用)

        注释:此递增方法实验出来似乎没有插入的记录也会占用一个id号码,如何解决

    8.5外键约束
        相关术语:
            外键约束,外键字段,外键值(外键字段中的每个值)

        班级表格创建:
            创建一:t_s tudet
            id号PK    name姓名        Classno班级            class班级
            ----------------------------------------------------------------------------
            1        zhang            1001            深圳大学信管专业1班
            2        li                1001            深圳大学信管专业1班
            3        liu                1002            深圳大学信管专业2班
            4        wang                1002            深圳大学信管专业2班
            5        aming            1001            深圳大学信管专业1班
            6        zuqiu                1001            深圳大学信管专业1班
            7        gualiu            1001            深圳大学信管专业1班
            分析:
            表一造成大量空间浪费

            创建二:
            t_class
                Classno班级PK            class班级        
                ----------------------------------------------
                    1001            深圳大学信管专业1班
                    1002            深圳大学信管专业2班
            
            t_student
                id号        name姓名            no班级FK
                ------------------------------------------
                1        zhang            1001    
                2        li                1001    
                3        liu                1002    
                4        wang                1002    
                5        aming            1001    
                6        zuqiu                1001    
                7        gualiu            1001    
            
        相关顺序
            创建表格顺序:
            先创建父表,再创建子表
            删除表格顺序:
            先删除子表,再删除父表
            插入数据的顺序:
            先父后子;
            删除数据的顺序:
            先子后父;
        语法:foreign key(子表被选中的字段) reference t_class(父表的主键字段)
        
        作用:
        减小存储空间的浪费;
        将班级t_student.no的输入值固定在1001与1002两个选项之间,其他无法输入;
        注释:
        当no字段没有约束时,可能会导致数据无效,也许会出现1003,所以需要给该字段添加外键约束。
        此时no字段就是外键字段,no每一个值都是外键值。

        使用:
        create table t_student(
        classno int,
        class varchar(255)
        );

        create table t_student(
        id int primary key auto_increment,
        name varchar(255),
        no int,
        foreign key (no) references t_class(classno)//约束:外键时no,引用父表的的主键字段或具有唯一性的字段
        ) ;

九、存储引擎

    mysql中特有,oracle中有相同的功能,但不叫该名称
    定义:存储或组织数据的方式;
    9.1添加/指定存储引擎:
        show create table 表名;//查看建表语句
        engine指定存储引擎,
        chareset指定默认字符编码方式;

    9.2msyql默认engine=innoDB,charset=utf8

    9.3建表语句:
    create table t_student(
        id int primary key auto_increment,
        name varchar(255),
        no int
        )
        engine = InnoDB default charset = utf8/GBk;
        
    9.4查看mysql支持的存储引擎;
        show engines \G
        版本不同支持情况不同;

    9.5mysql常用的存储引擎

        9.5.1MylSAM存储引擎特征:
            1.使用三个文件夹在底层数据中
            格式文件-存储表结构的定义(mytable.frm)
            数据文件-存储表行的内容(mytable.MYD)
            索引文件-存储表上索引(mytable.MYI):类似目录,缩小扫描范围
            
            2.对于一张表来说,只要是主键或加有unique就会自动创建索引。

            3.MyISAM不支持事务机制,安全性低。

            4.该种类型引擎可转化压缩,成为只读表来节省空间//优势

        9.5.2InnoDB存储引擎:(默认存储引擎,重要)
            1.InnoDB支持事务,支持数据库崩溃后自动恢复机制。
            2.InnoDB存储引擎最主要的特点是:非常安全。

            它管理的表具有下列主要特征:
              – 每个 InnoDB 表在数据库目录中以.frm 格式文件表示
              – InnoDB 表空间 tablespace 被用于存储表的内容(表空间是一个逻辑名称。表空间存储数据+索引。)

              – 提供一组用来记录事务性活动的日志文件
              – 用 COMMIT(提交)、SAVEPOINT 及ROLLBACK(回滚)支持事务处理
              – 提供全 ACID 兼容
              – 在 MySQL 服务器崩溃后提供自动恢复
              – 多版本(MVCC)和行级锁定
              – 支持外键及引用的完整性,包括级联删除和更新

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

        9.5.3MEMORY存储引擎

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

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

            MEMORY 存储引擎以前被称为HEAP 引擎。

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

十、事务(☆☆☆☆☆,必须掌握)

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

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

              以上的操作是一个最小的工作单元,要么同时成功,要么同时失败,不可再分。
              这两个update语句要求必须同时成功或者同时失败,这样才能保证钱是正确的。

    10.3只有DML语句才会有事务这一说,其它语句和事务无关!!!
            insert
            delete
            update
            只有以上的三个语句和事务有关系,其它都没有关系。

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

    10.4事务:批量的DML语句同时成功或同时失败,如果一个复杂业务只需要一条dml语句就能完成,则不需要事务存在了
            
    10.5事务如何做到一组语句同时成功或失败
        范例:InnoDB存储引擎:提供一组用来记录事务性活动的日志文件

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

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

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

            回滚事务?
              将之前所有的DML操作全部撤销,并且清空事务性活动的日志文件
              回滚事务标志着,事务的结束。并且是一种全部失败的结束。
    
    10.6提交事务,回滚事务的具体操作:
        事务:transaction
        提交事务:commit;
        回滚事务:rollback;(只能回滚到上一次提交点)

    10.7自动提交
        案例分析:删除一张表格的数据 
            1.    delete from st_student;
                rollback;
                //数据恢复失败
            2.    insert into t()value(。。。。),value()。。。。
                rollback;
                //数据并未清空
        原因:mysql默认执行一条myql语句就会提交一次

    10.8取消自动提交start transaction;

        原因:不符合开发要求,业务是由多条DML语句共同执行后提交完成;
            为了保证数据的安全,必须保证同时成功后再提交,

    10.9提交与回滚的演示:

        演示事务:
              ---------------------------------回滚事务----------------------------------------
              mysql> use bjpowernode;
              Database changed
              mysql> select * from dept_bak;
              Empty set (0.00 sec)

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

              mysql> insert into dept_bak values(10,'abc', 'tj');
              Query OK, 1 row affected (0.00 sec)

              mysql> insert into dept_bak values(10,'abc', 'tj');
              Query OK, 1 row affected (0.00 sec)

              mysql> select * from dept_bak;
              +--------+-------+------+
              | DEPTNO | DNAME | LOC  |
              +--------+-------+------+
              |     10 | abc   | tj   |
              |     10 | abc   | tj   |
              +--------+-------+------+
              2 rows in set (0.00 sec)

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

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


              ---------------------------------提交事务----------------------------------------
              mysql> use bjpowernode;
              Database changed
              mysql> select * from dept_bak;
              +--------+-------+------+
              | DEPTNO | DNAME | LOC  |
              +--------+-------+------+
              |     10 | abc   | bj   |
              +--------+-------+------+
              1 row in set (0.00 sec)

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

              mysql> insert into dept_bak values(20,'abc
              Query OK, 1 row affected (0.00 sec)

              mysql> insert into dept_bak values(20,'abc
              Query OK, 1 row affected (0.00 sec)

              mysql> insert into dept_bak values(20,'abc
              Query OK, 1 row affected (0.00 sec)

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

              mysql> select * from dept_bak;
              +--------+-------+------+
              | DEPTNO | DNAME | LOC  |
              +--------+-------+------+
              |     10 | abc   | bj   |
              |     20 | abc   | tj   |
              |     20 | abc   | tj   |
              |     20 | abc   | tj   |
              +--------+-------+------+
              4 rows in set (0.00 sec)

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

              mysql> select * from dept_bak;
              +--------+-------+------+
              | DEPTNO | DNAME | LOC  |
              +--------+-------+------+
              |     10 | abc   | bj   |
              |     20 | abc   | tj   |
              |     20 | abc   | tj   |
              |     20 | abc   | tj   |
              +--------+-------+------+
              4 rows in set (0.00 sec)
            ————————————————
10.10事物的4个特性:
    A,原子性:事务为最小的单元,不可再分;
    C,一致性:同一个事务当中,事务中的mysql语句(操作)必须同时成功或同时失败,
    I,隔离性:两个事务之间存在一定的隔离,如在同一张表上有AB两个事务同时对其进行操作,
    D,持久性:事务完成后,将数据存储到硬盘中,是事务最终成功的一个保障

10.11事务之间的隔离性:

        理论:

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

                事务和事务之间的隔离级别有哪些呢?4个级别

        1)读未提交:
                read uncommitted(最低的隔离级别)《没有提交就读到了》
                什么是读未提交?
                事务A可以读取到事务B未提交的数据。
                这种隔离级别存在的问题就是:
                脏读现象!(Dirty Read)
                我们称读到了脏数据。
              
              注释:这种隔离级别一般都是理论上的,大多数的数据库隔离级别都是二档起步!

            2)读已提交:
                    read committed 
       《提交之后才能读到》

                   定义:
                   事务A只能读取到事务B提交之后的数据。

                   解决问题:
                   解决了脏读的现象。
              
                   存在问题:
                   不可重复读取数据。
                
                    什么是不可重复读取数据呢?
                    在事务开启之后,第一次读到的数据是3条,当前事务还没有结束,可能第二次再读取的时候,读到的数据是4条,3不等于4
                称为不可重复读取。

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

            3)可重复读:
                            repeatable read
        《提交之后也读不到,永远读取的都是刚开启事务时的数据》
              
              什么是可重复读取?
                事务A开启之后,不管是多久,每一次在事务A中读取到的数据
                都是一致的。即使事务B将数据已经修改,并且提交了,事务A
                读取到的数据还是没有发生改变,这就是可重复读。
              
              解决问题:
                解决了不可重复读取数据。
              
              存在问题:
                可能会出现幻影读。
                每一次读取到的数据都是幻象。不够真实!
              
              早晨9点开始开启了事务,只要事务不结束,到晚上9点,读到的数据还是那样!
              读到的是假象。不够绝对的真实。

              mysql中默认的事务隔离级别就是这个!!!!!!!!!!!

            4)序列化/串行化:

                        serializable(最高的隔离级别)
              
              隔离级别最高,效率最低。解决了所有的问题。
              这种隔离级别表示事务排队,不能并发!
              
              synchronized,线程同步(事务同步)
              每一次读取到的数据都是最真实的,并且效率是最低的。

    查看隔离级别:
            语法:

                        select @@tx_isolation//5.7版本之前

                        select @@transaction_isolation;//5.7版本以后
            结果:
                +-----------------+
                | @@tx_isolation  |
                +-----------------+
                | REPEATABLE-READ |
                +-----------------+
    mysql默认的隔离级别

            案例:实操;
 

        

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值