zoukankan      html  css  js  c++  java
  • MySQL—事务(Transaction)(第六章)


    MySQL—事务(Transaction)详解


    举例说明:
    假设该场景发生于一个银行转账背景下,月中到了发工资的日子。学校打算给A老师发放一个月的工资:
    1:学校财务核对A老师工资单
    2:确认学校账上还有这么多钱
    3:向银行提出转账申请,银行扣除学校财务卡上的指定金额
    4:银行向A老师工资卡打入指定金额
    5:银行汇报双方交易完成
    但是,当这个过程执行完第3步的时候,突然断电。待电力系统回复之后,银行并不会继续执行4、5步甚至连1,2,3步的操作记录都丢失了。此时出现了如下的问题:
    1:学校认为,工资已经发出
    2:A老师认为,学校还没有发工资
    3:银行认为,从来就没有发生过转账的事情
    整个过程可以用一个词来描述:数据库中的数据产生了“不一致性”

    事务:是一个操作序列,这些操作只能都做,或者都不做,是一个不可分割的工作单位
    1.在操作MySQL过程中,对于一般简单的业务逻辑或中小型程序而言,无需考虑应用MySQL事务
    2.事务主要用于处理操作量大,复杂度高的数据
    3.MySQL中,事务由单独单元中的一个或多个SQL语句组成。在这个单元中,每个MySQL语句是相互依赖的。而整个单独单元作为一个不可分割的整体,要么都做,或者都不做
    4.如果单元中某条SQL语句一旦执行失败或产生错误,可以让整个单元回滚。所有受到影响的数据将返回到事务开始以前的状态(保证了数据的完整性)

    总结:

    包含一系列的sql语句,特点是:要么全部运行成功,要么一个也别成功。

    事务的特性(ACID):
    事务具有 4 个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持续性(Durability)。这 4 个特性简称为 ACID 特性。
    1)原子性A:

    • 事务的执行操作要么全部执行,要么全部不执行

    2)一致性C:

    • 事务开始之前处于一致性状态
    • 事务结束之后,数据库也处于一致性状态
      如:(在银行转账,转账前后两个账户金额一致)
      3)隔离性I:
    • 当多个事务同时运行时,各事务之间互相隔离,互补干扰
      4)持久性D:
      一个已完成的事务对所做的任何变动在系统中永久有效

    在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务
    事物语句:
    开启:begin 开启一个事物
    提交:commit 将事务中的SQL语句提交给数据库
    回滚:rollback 取消掉之前的所有操作(撤销事务)

    举例:
    CREATE TABLE t_person(
    id INT PRIMARY KEY AUTO_INCREMENT,
    sname VARCHAR(10),
    money INT
    ) TYPE=INNODB;创建一个InnoDB类型的数据表
    或者在创建表之后改变:ALTER TABLE t_person TYPE=INNODB;

    INSERT INTO t_person VALUES(1,'小明',1000);
    INSERT INTO t_person VALUES(2,'丽丽',2000);

    上面的代码中小明有1000块钱,丽丽有2000块钱
    接下来要实现小明给丽丽转账500元

    小明给丽丽转账500元
    BEGIN; -- 开始事物
    UPDATE t_person SET money=money-500 WHERE id=1;
    UPDATE t_person SET money=money+500 WHERE id=2;
    SELECT * FROM t_person; -- 查询结果是否有误
    COMMIT; -- 发现结果无误,提交事物,提交后数据库中数据会修改

    创建事务的一般过程是:开始事务、创建事务、应用SELECT语句查询数据、提交事务
    BEGIN; -- 开始事物
    UPDATE t_person SET money=money-500 WHERE id=1;
    UPDATE t_person SET money=money+600 WHERE id=2;
    SELECT * FROM t_person; -- 查询结有误果是否
    ROLLBACK; -- 结果有误,回滚事物,取消所有操作

    总结:
    我们可以声明一个事务的开始,在确认提交或者指明放弃前的所有操作,都先在一个叫做事务日志的临时环境中进行操作。待操作完成,确保了数据一致性之后,那么我们可以手动确认提交,也可以选择放弃以上操作。

    注意: 一旦选择了提交,就不能再利用回滚来撤销更改了

    有志者,事竟成,破釜沉舟,百二秦关终属楚; 苦心人,天不负,卧薪尝胆,三千越甲可吞吴。 想到与得到中间还有两个字——做到。
  • 相关阅读:
    回顾2018,展望2019
    NLog日志框架使用探究-1
    基于NetMQ的TLS框架NetMQ.Security的实现分析
    鸟哥的Linux私房菜笔记第五章,文件权限与目录配置(二)
    鸟哥的Linux私房菜笔记第五章,文件权限与目录配置(一)
    鸟哥的Linux私房菜笔记第四章
    ThinkPHP5.1 + tufanbarisyildirim 解析apk
    Java核心技术第八章——泛型程序设计(1)
    Java核心技术第五章——2.Object类
    Java核心技术第五章——1.类、超类、子类(2)
  • 原文地址:https://www.cnblogs.com/huoxc/p/12979720.html
Copyright © 2011-2022 走看看