MySQL–事务

csdn推荐

目录

一、事务 Transaction 1.事务的ACID四项特性

A:atemicity

原子性

事务中的所有操作,都是一个完整的整体,要么全成功,要么全失败,没有中间状态

C:consistency

一致性

事务发生在前、中、后阶段,数据应当保证一致性状态,数据不会受到任何破坏,事务最终一致是事务的最根本目的

I:isolation

隔离性

多事务工作期间互相不影响

D:durability

持久性

数据保证永远不丢失,数据落盘

2.事务生命周期 1)标准事务控制语句

begin/start transaction 开启事务

commit 提交事务

rollback 回滚事务

2)标准的事务语句

DML语句:update、delete、insert、select

3)事务操作演示

4)自动提交机制

select @@autocommit;

作用:在没有使用begin时显示触发DML操作,mysql会在此条命令执行完成后自动提交事务

一般是关闭掉的(设为0),不然自动提交后不能回滚

如何配置:vim /etc/f -->autocommit=0 重启生效

5)隐式提交的特殊情况

1)begin

a......

b......

begin(第二次begin时会触发隐式提交)

2)begin

set......(set命令会触发隐式提交)

3)DDL语句:alter、create、drop

4)DCL语句:GRANT/REVOKE/SET PASSWORD

5)锁定语法:LOCK TABLES 和 UNLOCK TABLES

6)TRUNCATE TABLE

6)触发隐式回滚的特殊情况

中间命令执行失败

会话结束:窗口关闭,kill...

数据库停止

二、事务的ACID如何保证 事务相关的关键名词解释

redo log

重做日志

磁盘文件:ib_logfile

内存缓冲区:redo log buffer

数据表空间

存放数据和索引

磁盘区:ibd

内存缓冲区:buffer_pool

LSN

日志序列号

mysql每次数据库启动,都会比较磁盘数据页和redo log的LSN,必须要求两者LSN一致数据库才能启动

WAL

日志优先写入

redo优先于数据写入磁盘,redo没写完,数据页不可能开始写

dirty page

脏页

内存脏页,内存中发生了修改,没写入到磁盘之前,被弄脏的数据页

CKPT

checkpoint

mysql维护着检查点队列(checkpoint list),检查点就是将脏页刷写到磁盘

DB_TRX_ID

事务号

InnoDB会为每一个事务生成一个事务号,伴随着整个事务生命周期

DB_ROLL_PTR

回滚指针

回滚信息的位置点

1.redo log 保障持久性,对于原子性和一致性也有保障

1)作用

重做日志

记录数据变化

记录LSN变化

记录UNDO信息,Trx_id,roll_ptr

记录有无commit_mark

2)刷新机制

事务提交时刷新:innodb_flush_log_at_trx_commit=1

成组提交:group commit

2.Undo 保障原子性,对于一致性和隔离性也有保障

1)作用

实现回滚的功能,也是MVCC特性的主要保障

undo是优先于redo记录信息的,所以能回滚

3.Double Write 机制

在buffer pool写入磁盘时,防止数据页出现部分写,则会把数据先写入double write文件中,再写入磁盘

double write文件一共2m,满了则会覆盖

只在系统宕机,出现部分写的时候会用到DW

4.ACSR自动故障恢复实现

例如:begin;

update set a=1 -->a=2;

未提交;

1)发起更新语句,从磁盘将t1.ibd,page_no=1001数据页,LSN=100,加载到buffer pool中

2)更新buffer pool中数据页之前,首先申请undo slot

3)生成当前事务DB_TRX_ID(6字节的事务号)和DB+ROLL+PTR(7字节的回滚指针)

4)开始修改内存buffer pool中的数据页的值,并更新LSN=101

5)在redo buffer中记录内存数据页修改的过程日志和LSN=101

6)如果此次事务的日志,随着其他的日志提交,则redo buffer中的日志刷写道redo log中

而假设在此时出现宕机,下次启动时,InnoDB的ACSR机制会自动进行故障恢复:

7)启动数据库引擎

8)InnoDB自动检查磁盘数据页ibd文件和redo log文件的LSN大小

9)如果发现--> redo log的LSN > ibd的LSN,则立即触发故障恢复机制

10)前滚:加载磁盘数据页和redo log到内存,通过redo buffer重做事务,构造脏页

11)回滚:检查到此次事务并没有commit标记,则触发回滚操作

12)此时,根据DB_TRX_ID(6字节的事务号)和DB+ROLL+PTR(7字节的回滚指针),从undo的segment的slot中找到此次事务的undo日志,进行回滚

13)所有工作做完,数据库实例正常启动,数据恢复到a=1的状态

5.隔离级别保障隔离性

1)作用

隔离级别 transaction_isolation,提供了读的隔离性,select、update、delete、insert都牵扯到读数据页

2)隔离级别的四种类型

名词解释:

脏读现象:事务工作期间,读到了别的事务正在发生修改的脏页

不可重复读:在同一个事务窗口,做相同数据的读取,得到的是不同的值

幻读:在事务更新的过程中,出现了其他事务已经提交的数据的幻行

RU

读未提交

脏读、不可重复读、幻读

RC

读已提交

不可重复读、幻读

RR(默认级别)

可重复读

幻读

SR

可串行化

可串行化

3)隔离级别设置

select @@transaction_isolation;默认是RR

6.MVCC多版本并发控制--事务快照

每次开启一个全新的事务窗口(begin),都会生成当前最新的事务快照,此次事务会在此次快照中进行操作,直到事务commit或rollback

这种技术也称为一致性快照读取,可以很大程度上提高事务的并发能力,防止RR级别下的不可重复读现象

文章来源:https://blog.csdn.net/weixin_41977045/article/details/139121762



微信扫描下方的二维码阅读本文

© 版权声明
THE END
喜欢就支持一下吧
点赞8 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容