mysql事务概念及特性讲解
3个W原则
要么都执⾏,要么都不执⾏,它是⼀个不可分割的⼯作单位。
Why
:事务是数据库维护数据⼀致性的单位,在每个事务结束时,都能保持数据⼀致性,如积分
:事务是数据库维护数据⼀致性的单位,在每个事务结束时,都能保持数据⼀致性,如积分
总表和积分详情表要么⼀起更新、新增成功要么⼀起失败
How
:
start transaction,step 1,step2,commit/rollback
:
start transaction,step 1,step2,commit/rollback
事务的四⼤特性ACID
原⼦性(Atomicity
):原⼦性指的是整个数据库的事务是⼀个不可分割的⼯作单位,每⼀个都应
):原⼦性指的是整个数据库的事务是⼀个不可分割的⼯作单位,每⼀个都应
该是⼀个原⼦操作。当我们执⾏⼀个事务的时候,如果⼀系列的操作中,有⼀个操作失败
了,那么,需要将这⼀个事务中的所有操作恢复到执⾏事务之前的状态,这就是事务的原⼦
性
⼀致性(Consistency
):
⼀致性
是指事务将数据库从⼀种状态转变为下⼀种⼀致性的状态,也就
):
⼀致性
是指事务将数据库从⼀种状态转变为下⼀种⼀致性的状态,也就
是说在事务执⾏前后,这两种状态应该是⼀样的,也就是数据库的完整性约束不会被破坏,
另外,需要注意的是⼀致性是不关注中间状态的
相互分离的,也就是互不影响的,这就是事务的隔离性。
持久性(Durability
):事务的
持久性
是指事务⼀旦提交,就是永久的了,就是发⽣问题,数据库
):事务的
持久性
是指事务⼀旦提交,就是永久的了,就是发⽣问题,数据库
也是可以恢复的。因此,持久性保证事务的⾼可靠性
Mysql事务隔离级别
read uncommitted
(读取未提交数据):即便是事务没有commit,但是其他连接仍然能读到未提
(读取未提交数据):即便是事务没有commit,但是其他连接仍然能读到未提
交的数据,这是所有隔离级别中最低的⼀种。(会导致脏读、幻读和不可重复读)
read committed
(可以读取其他事务提交的数据):当前会话只能读取到其他事务提交的数据,
(可以读取其他事务提交的数据):当前会话只能读取到其他事务提交的数据,
未提交的数据读不到(导致不可重复读和幻读)
repeatable read(可重读)—MySQL
默认的隔离级别:当前会话可以重复读,就是每次读取的结
默认的隔离级别:当前会话可以重复读,就是每次读取的结
果集都相同,⽽不管其他事务有没有提交(mvcc解决幻读问题)
serializable
(串⾏化):其他会话对该表的写操作将被挂起。可以看到,这是隔离级别中最严格
(串⾏化):其他会话对该表的写操作将被挂起。可以看到,这是隔离级别中最严格
的,但是这样做势必对性能造成影响
Mysql脏读幻读不可重复读
脏读:所谓脏读是指⼀个事务中访问到了另外⼀个事务未提交的数据
不可重复读:⼀个事务读取同⼀条记录
2
次,得到的结果不⼀致
2
次,得到的结果不⼀致
幻读:⼀个事务读取
2
次,得到的记录条数不⼀致
2
次,得到的记录条数不⼀致
Mysql事务MVCC结构
实现原理:
InnoDB
向存储在数据库中的每⼀⾏添加两个关键字段:DATA_TRX_ID
和
InnoDB
向存储在数据库中的每⼀⾏添加两个关键字段:DATA_TRX_ID
和
DATA_ROLL_PTR 。6字节的
DATA_TRX_ID
标记了最新更新这条⾏记录的transaction id,
DATA_TRX_ID
标记了最新更新这条⾏记录的transaction id,
每处理⼀个事务,其值⾃动+1。DATA_ROLL_PTR则表示指向该⾏回滚段的指针,该⾏上所
有旧的版本,在undo
中都通过链表的形式组织,⽽该值,正式指向undo
中该⾏的历史记录链
中都通过链表的形式组织,⽽该值,正式指向undo
中该⾏的历史记录链
表
MVCC的作⽤:
每⾏数据都存在⼀个版本,每次数据更新时都更新该版本。修改时Copy
出当前版本随意修
出当前版本随意修
改,各个事务之间⽆⼲扰。把修改前的数据存放于undo log,通过回滚指针与主数据关联
修改成功(commit
)啥都不做,失败则恢复
undo log
中的数据(rollback
)
)啥都不做,失败则恢复
undo log
中的数据(rollback
)
Read View:
员:ReadView{low_trx_id, up_trx_id, trx_ids},在并发情况下,⼀个事务在启动时,trx_sys
链表中存在部分还未提交的事务,那么哪些改变对当前事务是可⻅的,哪些⼜是不可⻅的,
这个需要通过ReadView来进⾏判定low_trx_id表示该
SQL
启动时,当前事务链表中最⼤的事
SQL
启动时,当前事务链表中最⼤的事
务id 编号,也就是最近创建的除⾃身以外最⼤事务编号;
up_trx_id表示该
SQL
启动时,当前事务链表中最⼩的事务
id
编号,也就是当前系统中创建最早
SQL
启动时,当前事务链表中最⼩的事务
id
编号,也就是当前系统中创建最早
但还未提交的事务; rx_ids表示所有事务链表中事务的
id
集合
s1: insert into user(1,”Daniel”)
id
集合
s1: insert into user(1,”Daniel”)
commit; s2: select * from user where id=1;
ReadView读取区别:
READ COMMITTED —— 每次读取数据前都⽣成⼀个
ReadView
ReadView
REPEATABLE READ —— 在第⼀次读取数据时⽣成⼀个
ReadView
ReadView
Mysql数据执⾏过程剖析
Buffer Pool是什么?
删改操作,其实主要就 是对这个内存数据结构中的缓存数据执⾏的
显示缓存区⼤⼩
show global variables like ‘innodb_buffer_pool_size’;
show global variables like ‘innodb_buffer_pool_size’;
Mysql 重要特性redo log和undo log
InnoDB
使⽤
undo
、
redo log
来保证事务原⼦性、⼀致性及持久性,同时采⽤预写⽇志⽅式将随机
使⽤
undo
、
redo log
来保证事务原⼦性、⼀致性及持久性,同时采⽤预写⽇志⽅式将随机
写⼊变成顺序追加写⼊,提升事务性能
undo log
:
:
作⽤:记录事务变更前的状态。操作数据之前,先将数据备份到undo log
,然后进⾏数据修改,如
,然后进⾏数据修改,如
果出现错误或⽤户执⾏了rollback
语句,则系统就可以利⽤
undo log
中的备份数据恢复到事务
语句,则系统就可以利⽤
undo log
中的备份数据恢复到事务
开始之前的状态。
内容:逻辑格式的⽇志,在执⾏
undo
的时候,仅仅是将数据从逻辑上恢复⾄事务之前的状态,⽽
undo
的时候,仅仅是将数据从逻辑上恢复⾄事务之前的状态,⽽
不是从物理⻚⾯上操作实现的
⽂件位置:位于数据库的
data
⽬录下的
ibdata
data
⽬录下的
ibdata
redo log
:
:
作⽤:记录事务变更后的状态。在事务提交前,只要将
redo log持久化即可,数据在内存中变更。
redo log持久化即可,数据在内存中变更。
当系统崩溃时,虽然数据没有落盘,但是redo log
已持久化,系统可以根据
redo Log的内容,
已持久化,系统可以根据
redo Log的内容,
将所有数据恢复到最新的状态。
内容:物理格式的⽇志,记录的是物理数据⻚⾯的修改的信息,其redo log
是顺序写⼊
redo log file
是顺序写⼊
redo log file
的物理⽂件中去的
⽂件位置:位于数据库的
data
⽬录下的 ib_logfile1&ib_logfile2
data
⽬录下的 ib_logfile1&ib_logfile2
checkpoint:
随着时间的积累,
redo Log
会变的很⼤很⼤。如果每次都从第⼀条记录开始恢复,恢
随着时间的积累,
redo Log
会变的很⼤很⼤。如果每次都从第⼀条记录开始恢复,恢
复的过程就会很慢。为了减少恢复的时间,就引⼊了checkpoint
机制。定期将databuffer的内
机制。定期将databuffer的内
容刷新到磁盘datafile
内,然后清除checkpoint之前的
redo log
。
内,然后清除checkpoint之前的
redo log
。
恢复:
InnoDB
通过加载最新快照,然后重做
checkpoint
之后所有事务(包括未提交和回滚了的),
InnoDB
通过加载最新快照,然后重做
checkpoint
之后所有事务(包括未提交和回滚了的),
再通过undo log回滚那些未提交的事务,来完成数据恢复
InndoBD doublewrite机制
双重写⼊缓冲区,
InnoDB
使⽤⼀种称为
doublewrite
的⽂件刷新技术。在将 ⻚
写⼊
数据⽂件
之
InnoDB
使⽤⼀种称为
doublewrite
的⽂件刷新技术。在将 ⻚
写⼊
数据⽂件
之
前,InnoDB
⾸先将它们写⼊称为 doublewrite
缓冲区的存储区域
⾸先将它们写⼊称为 doublewrite
缓冲区的存储区域
作⽤:提⾼
innodb
的可靠性,⽤来解决部分写失败
(partial page write⻚断裂
)
。在⻚⾯写⼊过程中
innodb
的可靠性,⽤来解决部分写失败
(partial page write⻚断裂
)
。在⻚⾯写⼊过程中
发⽣ os
,存储⼦系统或
mysqld
进程崩溃,则InnoDB
随后可以在
“
崩溃恢复
”
期间从
,存储⼦系统或
mysqld
进程崩溃,则InnoDB
随后可以在
“
崩溃恢复
”
期间从
doublewrite 缓冲区中找到该⻚⾯的良好副本。
doublewrite⼯作机制
带来的问题:
double write是⼀个buffer,
但其实它是开在物理⽂件上的⼀个buffer,
其实也就是
file,
所以它会
但其实它是开在物理⽂件上的⼀个buffer,
其实也就是
file,
所以它会
导致系统有更多的fsync
操作,
⽽硬盘的
fsync
性能是很慢的
,
所以它会降低
mysql
的整体性能。
操作,
⽽硬盘的
fsync
性能是很慢的
,
所以它会降低
mysql
的整体性能。
doublewrite buffer写⼊磁盘共享表空间这个过程是连续存储,是顺序写,性能⾮常⾼,(
约占
约占
写的%10)
,牺牲⼀点写性能来保证数据⻚的完整还是很有必要的。
,牺牲⼀点写性能来保证数据⻚的完整还是很有必要的。
配置
doublewrite :show variables like ‘%double%’;
doublewrite :show variables like ‘%double%’;
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/1272.html