mysql学习笔记(7)之事务


内容来源为六星教育,这里仅作为学习笔记

事务的基础理论

  1. 事务的基础理论
    原子性(Atomicity):语句要么全执行,要么全不执行,是事务最核心的特性,事务本身就是以原子性来定义的。实现主要基于undo log日志。
    持久性(Durability):保证事务提交后不会因为宕机等原因导致数据丢失。实现主要基于redo log日志。
    隔离性(Isolation):保证事务执行尽可能不受其他事务影响。InnoDB默认的隔离级别是RR,RR的实现主要基于锁机制、数据的隐藏列、undo log和类next-key lock机制。
    一致性(Consistency):事务追求的最终目标,要求数据由一个状态转化为另一个状态。
    实例:

    start transaction–开启事务
    insert into user (name,age,sex,status)values(‘will’,222,‘男’,1);
    commit;–提交事务
    rollback;–回滚事务

    查询事务自动提交状态
    show variables like ‘%commit%’;

    –全局修改
    set global autocommit=0;
    show global variables like ‘autocommit’;
    –局部修改
    set session autocommit=0;
    show global variables like ‘autocommit’;

事务通过锁实现隔离级别

每一个的事务的开启,我们可以把它看成一个盒子

事务的隔离级别:
读取未提交
读取已提交
可重读取(rr) innodb默认是这个级别
串行化

事务的生命周期

原子性的实现
begin;
select * from user where id =1;.
commit;
rollback
事务日志文件 =》 重做日志 redo log =》ib_logfile0 重新执行
回滚日志 undo log =》ibdata 回滚数据
Innodb的事务日志是指Redo log,简称Log,保存在日志文件ib_logfile里面(去mysql数据目录下看下)。
Innodb还有另外一个日志Undo log,但Undo log是存 放在共享表空间里面的(ibdata*文件,存储的是check point日志序列号)。

mysql对于事务的执行 =》 日志先行 凡是sql执行都会执行事务
日志优先级大于实际操作的数据的 所有执行的sql都会先执行日志,在写数据

BEGIN

update user set username = ‘111’ where id =1;
update user set username = ‘111’ where id =1;

2-3 重做日志的会是缓存 而 回滚才是实际的

show create table user

在这里插入图片描述

事务重做日志与回滚日志

– 查看事务日志 :
show engine innodb status\G;
– 查看日志文件设置状态
show variables like ‘innodb_%’;

innodb_log_files_in_group:DB中设置几组事务日志,默认是2; innodb_log_group_home_dir:事务日志存放目录,不设置,ib_logfile0…存在在数据文件目录下 Innodb存储引擎可将所有数据存放于ibdata*的共享表空间,也可将每张表存放于独立的.ibd文件的独立表空间

注意:在MySQL中对于数据来说, 最为重要的是日志文件

重做日志:redo log => ib_logfile0

回滚日志:undo log => ibdata

事务的重做日志

事务id,insert intouser(id,username,age)values(1,'php',10);
  1. 持久化
    事务被提交,数据一定会被写入到数据库中并持久存储起来,通常来说当事务已经被提交之后,就无法再次回滚了。

  2. 重做日志实现持久化
    与原子性一样,事务的持久性也是通过日志来实现的,MySQL 使用重做日志(redo log)实现事务的持久性,重做日志由两部分组成,一是内存中的重做日志缓冲区,因为重做日志缓冲区在内存中,所以它是易失的,另一个就是在磁盘上的重做日志文件,它是持久的。
    在这里插入图片描述当我们在一个事务中尝试对数据进行写时,它会先将数据从磁盘读入内存,并更新内存中缓存的数据,然后生成一条重做日志并写入重做日志缓存,当事务真正 提交时,MySQL 会将重做日志缓存中的内容刷新到重做日志文件,再将内存中的数据更新到磁盘上,图中的第 4、5 步就是在事务提交时执行的。

    问题:写入磁盘时候断电呢?
    在mysql事务执行了commit提交之后,服务器断电(挂了),但是数据还没有写入到磁盘中去。mysql会在下一次重启的时候根据重做日志写入数据

事务的回滚日志:

事务id,操作的数据元素,操作的前的数据,操作后的数据
  1. 原子性
    事务就是一系列的操作,要么全部都执行,要都不执行
  2. 回滚日志实现原子性
    想要保证事务的原子性,就需要在异常发生时,对已经执行的操作进行回滚,而在 MySQL 中,恢复机制是通过回滚日志(undo log)实现的,所有事务进行的 修改都会先记录到这个回滚日志中,然后在对数据库中的对应行进行写入。 注意:系统发生崩溃、数据库进程直接被杀死后,当用户再次启动数据库进程时,还能够立刻通过查询回滚日志将之前未完成的事务进行回滚,这也就需要回滚 日志必须先于数据持久化到磁盘上,是我们需要先写日志后写数据库的主要原因。 在日志文件中:在事务中使用的每一条 INSERT 都对应了一条 DELETE,每一条 UPDATE 也都对应一条相反的 UPDATE 语句。
    在这里插入图片描述

    回滚日志执行时间
    手动执行回滚命令时会执行
    如果程序在事务执行之后,提交命令执行之前出现了异常,在下次mysql服务重启的时候会执行

insert into user(id,username,age)values(1,‘php’,10); => delete from user where id =1;
执行:手动ROLLBACK
在mysql事务没有执行commit提交,但是发生了异常,在下一次mysql重启服务的时候执行

回滚实现的是事务的一致性以及原子性

隔离性通过事务的锁来实现 =》行级锁

持久性:通过事务的重做日志来实现

事务日志执行过程

在这里插入图片描述
2-3 重做日志的会是缓存 而 回滚才是实际的
innodb_log_buffer:日志缓冲区,目的创建redolog和undolog,并记录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值