• 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.不可重复读:修改数据后被读取,被读取之后再次修改数据,两次数据不一致
    
  • 相关阅读:
    Javascript自动垃圾收集机制
    Javascript深入浅出(二)
    Javascript深入浅出(一)
    递归&循环&迭代&遍历&枚举,知多少
    事件流、事件处理程序和事件对象
    弹性布局学习笔记
    css3 伪元素
    css3伪类选择器nth-of-type,:nth-last-of-type,:first-of-type,:last-of-type,:only-of-type
    css3结构伪类选择器first-child,last-child,nth-child(),nth-last-child(),only-child
    css3状态伪类选择器:checked修改按钮默认样式
  • 原文地址:https://www.cnblogs.com/tcy1/p/13355592.html
Copyright © 2020-2023  润新知