欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MySQL学习第六篇:什么是事务、手动提交事务流程

程序员文章站 2024-01-14 19:25:28
...

事务

1. 什么是事务

  • 事务原则

    ACID原则:原子性、一致性、持久性、隔离性(脏读、不可重复读、幻读)

    • 原子性(Atomicity)

      要么都成功,要么都失败

    • 一致性(Consistency)

      事务前后的数据完整性要保证一致,比如一共1000元

    • 持久性(Durability)

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

    • 隔离性(Isolation)

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

    • 隔离所导致的一些问题

      • 脏读:指一个事务读取了另外一个事务未提交的数据
      • 不可重复读:指在一个事务读取表中的某一行数据,多次读取结果不同。(这个不一定是错误,只是某些场合不对)
      • 虚读(幻读):指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致的问题

2. 手动提交事务流程

  • 流程说明

    -- mysql 是默认开启事务自动提交的
    set autocommit = 0 -- 关闭
    set autocommit = 1 -- 开启
    
    -- 手动处理事务
    -- 1. 关闭自动提交
    set autocommit = 0 -- 关闭
    -- 2. 事务开启
    start transaction	-- 标记一个事务的开始,从这个sql都在同一个事务内
    
    
    
    -- 3. 提交:持久化(成功!)
    commit
    -- 回滚: 回到原来的样子(失败)
    rollback
    -- 4. 事务结束,开启自动提交
    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)
    
    -- 模拟转账,注意执行的时候要一句一句的执行测试
    SELECT * from account
    -- 1. 关闭自动提交
    set autocommit = 0
    -- 2. 开启一个事务
    start transaction
    
    update `account` set `money` = `money`-500 where `name`='A'	-- A减500
    update `account` set `money` = `money`+500 where `name`='B'	-- B加500
    -- 3. 提交事务
    commit;
    -- 回滚
    rollback
    -- 4. 事务结束,开启自动提交
    set autocommit = 1
    
相关标签: 数据库