• InnoDB核心特性-事务


    1.什么是事务

    主要针对DML语句(update,delete,insert)
    
    1.一组数据操作执行步骤,这些步骤被视为一个工作单元:
        1)用于对多个语句进行分组
        2)可以在多个客户机并发访问同一个表中的数据时使用
        
    2.所有步骤都成功或都失败
        1)如果所有步骤正常,则执行
        2)如果步骤出现错误或不完整,则回滚

    2.事务演示

    #1.创建一个表
    mysql> create table jiaoyi(id int,name varchar(10),money int);
    
    #2.插入数据
    mysql> insert jiaoyi values(1,'qiudao',300),(2,'lhd',200);
    
    #3.开启一个事务
    mysql> begin;
    mysql> update jiaoyi set money=400 where id=2;
    mysql> update jiaoyi set money=100 where id=1;
    
    #4.提交事务之前,再开一个窗口查看数据,数据没有发生改变
    mysql> select * from jiaoyi;
    +------+--------+-------+
    | id   | name   | money |
    +------+--------+-------+
    |    1 | qiudao |   300 |
    |    2 | lhd    |   200 |
    +------+--------+-------+
    2 rows in set (0.00 sec)
    
    #5.提交事务
    mysql> commit;
    
    #6.再次到新窗口查看数据
    mysql> select * from jiaoyi;
    +------+--------+-------+
    | id   | name   | money |
    +------+--------+-------+
    |    1 | qiudao |   100 |
    |    2 | lhd    |   400 |
    +------+--------+-------+
    2 rows in set (0.00 sec)
    
    #7.再次开启事务修改数据
    mysql> begin;
    mysql> update jiaoyi set money=-100 where id=1;
    mysql> update jiaoyi set money=600 where id=2;
    mysql> select * from jiaoyi;
    +------+--------+-------+
    | id   | name   | money |
    +------+--------+-------+
    |    1 | qiudao |  -100 |
    |    2 | lhd    |   600 |
    +------+--------+-------+
    2 rows in set (0.00 sec)
    
    #8.结束事务之前,由程序判断,发现money钱数不能为负数,所以这次修改数不符合逻辑,只能回滚
    mysql> rollback;
    mysql> select * from jiaoyi;
    +------+--------+-------+
    | id   | name   | money |
    +------+--------+-------+
    |    1 | qiudao |   100 |
    |    2 | lhd    |   400 |
    +------+--------+-------+
    2 rows in set (0.00 sec)

    3.事务的通俗理解

    伴随着“交易”出现的数据库概念。
    
    我们理解的“交易”是什么?
        1)物与物的交换(古代)
        2)货币现金与实物的交换(现代1)
        3)虚拟货币与实物的交换(现代2)
        4)虚拟货币与虚拟实物交换(现代3)
    
    数据库中的“交易”是什么?
        1)事务又是如何保证“交易”的“和谐”?
        2)ACID

    4.事务完整流程

    #成功的事务
    begin;
    sql1;
    sql2;
    ....
    commit;
    
    #失败的事务
    begin;
    sql1;
    sql2;
    ....
    rollback;

    5.事务的特性(ACID)

    Atomic(原子性)
    所有语句作为一个单元全部成功执行或全部取消。
    
    Consistent(一致性)
    如果数据库在事务开始时处于一致状态,则在执行该事务期间将保留一致状态。
    
    Isolated(隔离性)
    事务之间不相互影响。
    
    Durable(持久性)
    事务成功完成后,所做的所有更改都会准确地记录在数据库中。所做的更改不会丢失。

    6.事务的控制语句

    #事务常用的语句
    BEGIN:        开始一个新事务
    COMMIT:        永久记录当前事务所做的更改
    ROLLBACK:    回滚当前事务所做的更改
    
    #事务指定回滚
    SAVEPOINT:    分配事务过程中的一个位置,以供将来引用
    ROLLBACK TO SAVEPOINT:取消在 savepoint 之后执行的更改
    RELEASE SAVEPOINT:删除 savepoint 标识符
    
    #自动提交
    SET AUTOCOMMIT:为当前连接禁用或启用默认 autocommit 模式

    7.自动提交

    #临时关闭自动提交
    mysql> set autocommit=0;
    
    #永久关闭自动提交
    [root@db01 ~]# vim /etc/my.cnf
    [mysqld]
    autocommit=0

    8.隐式提交

    1.现在版本在开启事务时,不需要手工begin,只要你输入的是DML语句,就会自动开启事务。
    2.有些情况下事务会被隐式提交
        1)在事务运行期间,手工执行begin的时候会自动提交上个事务
        2)在事务运行期间,加入DDL、DCL操作会自动提交上个事务
        3)在事务运行期间,执行锁定语句(lock tables、unlock tables)
        
        4)load data infile
        5select for update
  • 相关阅读:
    [BZOJ 4117] Weather Report
    [BZOJ 3233] 找硬币
    集合迭代器Iterator
    如何实现数组与List的相互转换?在 Queue 中 poll()和 remove()有什么区别?哪些集合类是线程安全的?
    ArrayList分别与LinkedList、Vector、Array的区别
    HashMap与TreeMap
    HashSet原理
    并发场景下HashMap死循环导致CPU100%的问题
    HashMap工作原理
    HashMap与HashTable的区别
  • 原文地址:https://www.cnblogs.com/chenlifan/p/13907375.html
Copyright © 2020-2023  润新知