zoukankan      html  css  js  c++  java
  • MySQL--事务介绍

    一、事务介绍

    1.事物的周期

    1)成功的周期

    begin;
    sql1;
    sql2;
    sql3;
    ...
    commit;
    

    2)失败的周期

    begin;
    sql1;
    sql2;
    sql3;
    ...
    rollback;
    

    2.事务的特性

    A:原子性
    C:一致性
    I:隔离性
    D:持久性
    

    二、事务的日志

    1.redo log

    redo,顾名思义“重做日志”,是事务日志的一种
    

    1)作用

    在事务ACID过程中,实现的是“D”持久化的作用。
    
    REDO:记录的是,内存数据页的变化过程
    
    特性:WAL(Write Ahead Log)日志优先写
    

    2)图解

    3)文字描述流程

    #修改
    1)首先将表中id=1的行所在数据页加载到内存中data buffer page
    2)MySQL实例在内存中将id=1的数据页改成id=2
    3)id=1变成id=2的变化过程会记录到,redo内存区域,也就是redo buffer page中
    4)当敲下commit命令的瞬间,MySQL会将redo buffer page写入磁盘区域redo log
    5)当写入成功之后,commit返回ok
    
    #查询
    1.首先将表中id=1的行所在数据页加载到内存中data buffer page
    2.将redo log中id=1变成id=2的变化过程取加载到redo buffer page
    3.通过data buffer page和redo buffer page得到一个结果
    

    2.undo log

    undo,顾名思义“回滚日志”,是事务日志的一种
    

    1)作用

    在事务ACID过程中,实现的是“A”原子性的作用。当然CI的特性也和undo有关。
    · 当断电,或者未将数据commit提交,则在undo buffer page undo缓存区则不会有记录
    · 当用户查询数据,则会从date buffer page、redo buffer page redo缓存区和undo buffer page undo缓存区中同时拿取数据,但是最后以undo buffer page 也就是undo缓存区中生效。
    · 总的来说,就是只要没有commit则数据就不会生效,也就是回滚日志,当用户在查询就只会是初始未修改数据
    

    2)图解

    3.redo和undo的存储位置

    #redo位置
    [root@db01 data]# ll /application/mysql/data/
    -rw-rw---- 1 mysql mysql 50331648 Aug 15 06:34 ib_logfile0
    -rw-rw---- 1 mysql mysql 50331648 Mar  6  2017 ib_logfile1
    
    #undo位置
    [root@db01 data]# ll /application/mysql/data/
    -rw-rw---- 1 mysql mysql 79691776 Aug 15 06:34 ibdata1
    -rw-rw---- 1 mysql mysql 79691776 Aug 15 06:34 ibdata2
    

    三、事务中的锁

    1.什么是锁

    “锁”顾名思义就是锁定的意思。
    

    2.作用

    在事务ACID特性过程中,“锁”和“隔离级别”一起来实现“I”隔离性的作用。
    

    3.锁的类别

    排他锁:保证在多事务操作时,数据的一致性。(在我修改数据时,其他人不得修改)
    共享锁:保证在多事务工作期间,数据查询时不会被阻塞。
    
    乐观锁:多实务操作时,数据可以同时修改,谁先提交,以谁为准
    悲观锁:多实务操作时,数据只有一个人可以修改
    

    4.多版本并发控制

    1.只阻塞修改类操作(排他锁),不阻塞查询类操作(共享锁)
    2.乐观锁的机制(谁先提交谁为准)
    

    5.锁的粒度

    1.MyIsam:表级锁
    2.Innodb:行级锁
    

    四、事务中的隔离级别

    1.四种隔离级别

    1.RU级别:READ UNCOMMITTED(独立提交):未提交读,允许事务查看其他事务所进行的未提交更改
    
    2.RC级别:READ COMMITTED:允许事务查看其他事务所进行的已提交更改,查看不需要重新记入数据库
    
    3.RR级别:REPEATABLE READ:允许事务查看其他事务所进行的已提交更改,查看数据需要重新进入数据库(InnoDB 的默认级别)
    
    4.串行化:SERIALIZABLE:将一个事务的结果与其他事务完全隔离
    

    2.查看隔离级别

    #查看隔离级别(默认为rr级别)
    mysql> show variables like '%iso%';
    +---------------+-----------------+
    | Variable_name | Value           |
    +---------------+-----------------+
    | tx_isolation  | REPEATABLE-READ |
    +---------------+-----------------+
    

    3.设置隔离级别

    1)设置RU级别

    [root@db03 ~]# vim /etc/my.cnf
    transaction_isolation=read-uncommit
    

    2)设置RC级别

    [root@db03 ~]# vim /etc/my.cnf
    transaction_isolation=read-commit
    

    4.名词

    1.脏读:RU级别,执行事务修改数据,被读取,但是数据最终回滚了,查询到的数据就是脏读
    
    2.幻读:删除所有表数据,删除的同时有人插入数据,查看数据时以为是没删干净
    
    3.不可重复读:修改数据后被读取,被读取之后再次修改数据,两次数据不一致
    
  • 相关阅读:
    字符串替换
    字符串查找
    字符串比较
    字节与字符串相互转换
    1365. How Many Numbers Are Smaller Than the Current Number
    1486. XOR Operation in an Array
    1431. Kids With the Greatest Number of Candies
    1470. Shuffle the Array
    1480. Running Sum of 1d Array
    【STM32H7教程】第56章 STM32H7的DMA2D应用之刷色块,位图和Alpha混合
  • 原文地址:https://www.cnblogs.com/tcy1/p/13355592.html
Copyright © 2011-2022 走看看