MySQL_事务学习笔记

事务

  1. 注意:一定要使用 Innodb 存储引擎

  2. 概述:一组操作的集合,是不可分割的工作单元,会把一个部分当成一个整体来处理,事务会把操作同时提交或者是撤销。要么同时成功,要么同时失败。

  3. 比如:上云转账1000元给张三,第一,上云账户少1000,第二,张三账户多一千。
    在这里插入图片描述

事务操作

  1. 数据准备

    drop table if exists account; 
    #创建账户信息表
    create table account( 
    	id int primary key AUTO_INCREMENT comment 'ID',
    	name varchar(10) comment '姓名', 
    	money double(10,2) comment '余额' 
    ) comment '账户表'; 
    
    insert into account(name, money) VALUES ('上云',4000), ('张三',4000);
    

未控制事务演示

  1. 正常转账的情况下

    #正常转账的情况下
    select * from account;
    
    #减少上云账户上的1000元
    update account set money = money -1000 where name = '上云'; 
    #增加张三账户上的1000元
    update account set money = money + 1000 where name = '张三';
    

在这里插入图片描述

  1. 异常转账的情况下

    select * from account;
    
    update account set money = 4000;
    
    update account set money = money -1000 where name = '上云'; 
    
    出错了
    
    update account set money = money + 1000 where name = '张三';
    

控制事务方式1

  1. 查看事务提交方式

    SELECT @@autocommit
    
    
    1:自动提交
    0:手动提交
    
  2. 设置事务提交方式

    set @@autocommit=0;#设置成手动提交
    
  3. 提交事务

    commit;
    
  4. 回滚事务

    rollback;
    

控制事务方式2

  1. 开启事务

    start transaction 或者 begin;
    
  2. 提交事务

    commit;
    
  3. 回滚事务

    rollback;
    

事务的作用对象

  1. 只能回滚 insert、delete 和 update 语句,不能回滚 select(回滚 select 没有任何意义),对于
    create、drop、alter 这些无法回滚.

事务的四大特征(ACID)

  1. 原子性(Atomicity):整个事务中的所有操作,必须作为一个单元全部完成(或全部取消)不可分割,要么全部成功,要么全部失败
  2. 一致性(Consistency)事务完成时,数据保持一致状态
  3. 隔离性(Isolation):数据库会提供隔离机制,并发不会相互影响和干扰,一个事务不会影响其他事务的运行
  4. 持久性(Durability):在事务完成以后,该事务对数据库所作的更改将持久地保存在数据库之中,并不会被回滚。

并发事务的问题(面试经常问)

  1. 脏读:一个事务读到另外一个事务还没有提交的数据
    • 事务B读取到事务A还没有提交的数据
      在这里插入图片描述
  2. 不可重复读:一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读。
    • 事务A两次读取同一条数据,但是读取到的数据不一样
      在这里插入图片描述
  3. 幻读:一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了 “幻影”。
    在这里插入图片描述

事务的隔离级别

在这里插入图片描述

  1. 注意:隔离级别越高,数据越安全,但是性能低。需要在性能和安全之间进行取舍。

  2. 查看隔离级别:

    SELECT @@TRANSACTION_ISOLATION;
    

    在这里插入图片描述

  3. 设置隔离级别

    SET [ SESSION | GLOBAL ] TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE }
    
    • 隔离级别分为全局的和会话级的

      • 全局的:对所有会话有效(global)
      • 会话级的:只对当前的会话有效(session)

      在这里插入图片描述

演示
  1. 脏读(read uncommitted 未提交读)

    会话1会话2
    use transaction;use transaction;
    set global transaction isolation level read uncommitted;
    start transaction;
    start transaction;
    insert into account values(2,‘sy’,100);
    select * from account;
    rollback;
    select * from account;
  2. read committed(已提交读)

    会话1会话2
    set global transaction isolation level read committed;
    start transaction;
    start transaction;
    insert into account values(2,‘sy’,100);
    select * from account;
    select * from account;(不能查询出数据)
    commit;
    select * from account;(查询出数据)
  3. repeatable read(可重复读)

    会话1会话2
    set global transaction isolation level repeatable read;
    start transaction;
    start transaction;
    insert into account values(3,‘xxxxy’,100);
    select * from account(读不出来)
    commit;
    select * from account(能读出来)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值