zoukankan      html  css  js  c++  java
  • 事务ACID原则、脏读、不可重复读、幻读、转账事务

    事务ACID原则、脏读、不可重复读、幻读

    事务(transaction):要么都成功、要么都失败

    ACID原则:

    • 原子性(Atomicity):要么都成功、要么都失败

    • 一致性(Consistency):事务前后的数据完整性要保持一致

    • 隔离性(Isolation):是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数 据所干预

    • 持久性(Durability):事务提交,事务一旦提交则不可逆,被持久化到数据库中!

    隔离所导致的一些问题

    • 脏读:

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

    • 不可重复读:

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

    • 幻读:

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

    image-20200531190342167

    -- ===============事务=================
    
    -- MySQL是默认开启事务自动提交的
    set autocommit = 0 -- 关闭
    set autocommit = 1 -- 开启(默认的)
    
    -- 1.手动处理事务
    set autocommit = 0 -- 关闭自动提交
    -- 2.事务开启
    start transaction -- 标记一个事务的开始,从这个之后的SQL都在同一个事务内
    -- 3.操作
    insert xxx
    insert xxx
    -- 4.提交:持久化(成功!)
    commit
    -- 回滚:回到原来的样子(失败!)
    rollback
    -- 5.事务结束
    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, -- decimal(9,2) 总共9位,小数占了2位
    	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' -- B加500
    
    commit -- 提交事务,就被持久化了
    rollback -- 回滚
    
    set autocommit = 1 -- 恢复默认值
    

    事务前: 事务后:

    image-20200531194712291image-20200531194426895

    Java层的事务实现

    java
    方法(){
        try(){
            正常的业务代码
            commit()
        }catch(){
            rollback()
        }
    }
    
  • 相关阅读:
    梅小雨20191010-2 每周例行报告
    梅小雨20190919-1 每周例行报告
    梅小雨20190919-4 单元测试,结对
    王可非 20191128-1 总结
    20191121-1 每周例行报告
    20191114-1 每周例行报告
    对“都是为了生活”小组成员帮助的感谢
    20191107-1 每周例行报告
    20191031-1 每周例行报告
    20191024-1 每周例行报告
  • 原文地址:https://www.cnblogs.com/mytJava/p/13021048.html
Copyright © 2011-2022 走看看