zoukankan      html  css  js  c++  java
  • MySQL——事物

    要么都成功,要么都失败

    将一组SQL 放在一个批次中去执行

    一一一一一一

    1、SQL 执行 A 给 B 转账 A:1000 转 --->200 B :200

    2、SQL 执行 B 收到 A 的钱 A: 800 —> B :400

    一一一一一一

    1.1、事务原则 : ACID 原则 原子性,一致性,隔离性,持久性 (脏读,幻读….)

    参考博客连接 : https://blog.csdn.net/dengjili/article/details/82468576

    原子性(Atomicity)

    要么都成功,要么都失败

    一致性(Consistency)

    事务前后的数据完整性要保证一致

    持久性(Durability)--- 事务提交

    事务一旦提交则不可逆,被持久化到数据库中!

    隔离性(Isolation)

    事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。

    1.2、隔离所导致的一些问题

    脏读:

    指一个事务读取了另外一个事务未提交的数据。

    不可重复读:

    在一个事务内读取表中的某一行数据,多次读取结果不同。(这个不一定是错误,只是某些场合不对)

    虚读(幻读)

    是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。

    1.3、执行事务

    • start transaction:标记一个事物开始,从这个之后的sql都在同一个事物中
    • commit:提交(持久化)
    • rollback:回滚(回到原来的样子)
    • set autocommit:开启自动提交(默认)
    • savepoint:设置一个食物的保存点
    • rollback to savepoint:回滚到保存点
    • release savepoint:撤销保存点
    -- ==================== 事务 =========================
    
    -- mysql 是默认开启事务自动提交的
    SET autocommit = 0 /* 关闭 */
    SET autocommit = 1 /* 开启(默认的) */
    
    -- 手动处理事务
    SET autocommit = 0 -- 关闭自动提交
    
    -- 事务开启
    START TRANSACTION  -- 标记一个事务的开始,从这个之后的 sql 都在同一个事务内
    
    INSERT xx
    INSERT xx
    
    -- 提交: 持久化 (成功!)
    COMMIT
    -- 回滚: 回到的原来的样子 (失败!)
    ROLLBACK
    
    -- 事务结束
    SET autocommit = 1 -- 开启自动提交
    
    -- 了解
    SAVEPOINT 保存点名 -- 设置一个事务的保存点
    ROLLBACK TO SAVEPOINT 保存点名 -- 回滚到保存点
    RELEASE SAVEPOINT 保存点名 -- 撤销保存点
    
    

    模拟场景

    -- 转账
    CREATE DATABASE shop CHARACTER SET utf8 COLLATE utf8_general_ci
    USE shop
    
    CREATE TABLE `account`(
      `id` INT(3) NOT NULL AUTO_INCREMENT,
      `name` VARCHAR(30) NOT NULL,
      `money` DECIMAL(9,2) NOT NULL,
      PRIMARY KEY (`id`)
    )ENGINE=INNODB DEFAULT CHARSET=utf8
    
    
    INSERT INTO account(`name`,`money`)
    VALUES ('A',2000.00),('B',10000.00)
    
    -- 模拟转账:事务
    SET autocommit = 0; -- 关闭自动提交
    START TRANSACTION -- 开启一个事务 (一组事务)
    
    UPDATE account SET money=money-500 WHERE `name` = 'A' -- A减500
    UPDATE account SET money=money+500 WHERE `name` = 'B' -- A加500
    
    COMMIT; -- 提交事务,就被持久化了!
    ROLLBACK;  -- 回滚
    
    SET autocommit = 1; -- 恢复默认值
    
  • 相关阅读:
    C++Josephus问题
    C++背包示例
    C++1000以内的质数
    as3+asp+access编码
    fb设置flashplayer
    三视图示例
    正确实现 IDisposable 接口
    .net垃圾回收和CLR 4.0对垃圾回收所做的改进之二
    .net垃圾回收和CLR 4.0对垃圾回收所做的改进之三
    CLR 全面透彻解析:大型对象堆揭秘
  • 原文地址:https://www.cnblogs.com/godles/p/12212650.html
Copyright © 2011-2022 走看看