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; -- 恢复默认值
    
  • 相关阅读:
    【eoe资源】通过片段创建灵活的用户界面
    史上最全的Android开发索引帖
    临时记录
    五种开源协议的比较(BSD,Apache,GPL,LGPL,MIT)
    【转】深入探讨 Android 传感器
    Java Collections Framework Java集合框架List,Map,Set等全面介绍之概要篇
    谷歌 G1 android APK安装器 离线安装软件
    【转】請為你的 Android 程式加上 obfuscation 吧!
    【转】Android Toolchain与Bionic Libc
    用VirtualBox在XP环境下虚拟Ubuntu的过程
  • 原文地址:https://www.cnblogs.com/godles/p/12212650.html
Copyright © 2011-2022 走看看