事务

1. 物理存储结构

1.1 表空间

支持两类表空间: 共享,独立
5.5 版本 :  默认共享表空间.    包含: 数据字典\undo\tmp\用户表数据和索引
5.6 版本 :  默认独立表空间.    包含: 数据字典\undo\tmp,将用户数据和索引独立,每个表单独存储
5.7 版本 :  默认独立表空间.    包含: 数据字典\undo,tmp独立,将用户数据和索引独立,每个表单独存储
8.0 版本 :  默认独立表空间.    数据字典取消掉, undo,tmp独立  将用户数据和索引独立,每个表单独存储

1.2 功能名词介绍

transaction           事务
undo  : ibdata1       回滚日志
tmp   : ibtmp1        临时表空间 
redo  : ib_logfile0~N 重做日志
ibd   : t1.ibd        表空间数据文件


Innodb Buffer Pool    数据缓冲区池(70-80%)
log buffer            重做日志缓冲区
LSN                   日志序列号  
Trx_id                事务ID
checkpoint            检查点  

1.3 事务 ?

1.3.1 什么是事务?

将多条DML(标准的事务语句),放在一个"组"中运行,要么全成功要么全失败.

1.3.2 事务ACID特性atomicity, consistency, isolation, and durability.

A   : 原子性   : 每一个事务都是一个完整整体,不可再分性 . 要么全执行成功要么全失败.
C   : 一致性   : 在事务前,中,后,保证事务操作的数据前后一致.
I   : 隔离性   : 多个事务之间,所做事务互不干扰,不能同时更新同一行数据.
D   : 持久性   : 事务完成之后,所涉及到的数据,必须永久有效(落地)

1.3.3 事务的生命周期管理

标准的事务生命周期: 
(1) 开启一个事务 
begin / start transaction;
(2) 标准的事务语句 
insert 
update  
delete
(3) 结束事务 
commit;     # 提交事务 
rollback; # 回滚事务
 

非标准的事务生命周期
(1) 自动提交机制 
MySQL 5.6 以后:
1. begin子句会自动添加
2. 每一条执行完成之后都会自动提交
mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
|            1 |
+--------------+
[root@db01 data_3306]# vim /etc/my.cnf 
autocommit=0
[root@db01 data_3306]# /etc/init.d/mysqld restart
说明: 默认情况下,开启事务时不加begin,逐条自动提交. 手工开启begin命令,按照正常事务工作过程.


(2) 隐式提交
用于隐式提交的 SQL 语句:
begin 
a
b
begin
SET AUTOCOMMIT = 1
导致提交的非事务语句:
DDL语句: (ALTER、CREATE 和 DROP)
DCL语句: (GRANT、REVOKE 和 SET PASSWORD)
锁定语句:(LOCK TABLES 和 UNLOCK TABLES)
导致隐式提交的语句示例:
TRUNCATE TABLE
LOAD DATA INFILE
SELECT FOR UPDATE


(3) 隐式回滚
会话断开
数据库重启
死锁 

1.3.4 事务底层的工作过程

image.png
(1) redo 
分布: 
    内存: log buffer
    磁盘: ib_logfile0~N
功能: 
    1. 保存内存数据页的变化
    2. commit时, 实现事务的快速持久化的特性:  量少,顺序IO
    3. 宕机时,通过redo实现重做事务,将数据库恢复到宕机之前的状态.
    我们由把这步称之为 ACSR 中的"前滚"操作
(2) undo 回滚日志
分布:    默认 ibdata1, 5.7开始可以独立undo,8.0后自动独立 

功能 :   
     1. 保存当前事务操作的反操作
     2. 在执行rollback命令时,undo提供回滚操作,在ACID中主要实现A的特性,CI也有部分功能
     3. 宕机时,ACSR过程中提供回滚操作(将没有commit标记的)

1.3.5 锁(写) 及 隔离级别(读)主要保证隔离性

(1) 锁 :
 S    : 共享锁,读锁
 X    : 排它锁,写锁
 IS   : 意向S 
 IX   : 意向X

(2) X 锁的细分

TX       ------> 表锁   DDL
全局锁表:
备份时,备份系统表时(非INOODB表),FTWRL
mysql> flush table with read lock;
mysql> unlock tables;
单表: DDL

mysql> lock table t1 read ;
mysql> unlock tables; 

RX       ------> 记录锁 DML
GAP  LOCK X     ------> 间隙锁 特殊DML
Next LOCK X     ------> 下一键锁定

(3) 隔离级别(transaction_isolation)
mysql> select @@transaction_isolation;
RU :读未提交 READ-UNCOMMITTED

模拟:
session A
mysql> begin;
mysql> use world
mysql> delete from city where id=1000;

session B
mysql> begin;
mysql> use world
mysql> select *from city where id=1000;

会产生的问题:
1. 脏读:A表删除一段数据,B表进行查询可以发现这条数据不存在。当A表进行回滚操作(rollback)后,B表再次进行查询,发现数据又会回来。
效果如图:


image.png

2. 不可重复读现象
3. 幻读

RC :读已提交 ***** READ-COMMITTED
1. 不可重复读现象:执行同一条语句所得结果不同。
效果如图:


image.png

2. 幻读:A表执行某种操作时,B表插入符合A表所执行条件的数据,A表执行完成commit后,经过查询,结果与所执行命令的条件不符,这种情况为幻读。

RR :可重复读 ***** REPEATABLE-READ
1. 幻读
说明:

  1. RR级别+ GAP(间隙所)+ Next lock(GAP+RX(记录锁))有效防止幻读现象
  2. 通过MVCC,多版本并发控制中,一致性快照读技术,解决了不可重复读问题.
    SR :串行化

总结:
AID 都是为了数据库最终一致性 C
SQL_MODE
约束

自己扩展:
MDL 原数据锁
page lock 页锁
latch 内存页锁

2. InnoDB 存储引擎核心参数 *****

mysql> select @@innodb_data_file_path;     共享表空间的设置参数
mysql> select @@innodb_file_per_table;     共享表空间的设置参数
mysql> select @@innodb_buffer_pool_size;   #不要超过80%物理内存 ----> Out of memory  
mysql> select @@innodb_log_buffer_size;    日志缓冲区的大小
mysql> select @@innodb_log_file_size;      日志文件的大小
mysql> select @@innodb_log_file_in_group;
mysql> select @@innodb_flush_log_at_trx_commit; # 双1标准之一.控制redo刷写的策略.
0  每秒钟刷写redo到磁盘. 
1  每次事务提交,理解刷写redo到磁盘
2  每次事务提交,立即写日志到OS cache中,然后每秒钟刷写到磁盘.

mysql> select @@innodb_flush_method; 控制(buffer脏页,redo buffer日志)刷写方式
建议设置:   
    O_DIRECT :  数据页刷写磁盘直接穿过文件系统缓存,redo 刷写时,先写os cache,再写到磁盘。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • --- layout: post title: "如果有人问你关系型数据库的原理,叫他看这篇文章(转)" date...
    蓝坠星阅读 920评论 0 3
  • 索引 数据库中的查询操作非常普遍,索引就是提升查找速度的一种手段 索引的类型 从数据结构角度分 1.B+索引:传统...
    一凡呀阅读 3,236评论 0 8
  • 事务处理 事务处理是数据库中的一个大块头,涉及到数据的完整性与一致性问题,由于mysql存在多种数据存储引擎提供给...
    tanghomvee阅读 846评论 0 0
  • 作者:55 来自微信公众号:老友信 寒假前两周,一 一变得什么都不想干,早上穿衣服都让奶奶代劳。我突然想起在哪里看...
    33语安阅读 696评论 0 50
  • 楔子 兴致上来和方知晴通了个电话,我耳里是操场上凌冽的风,她身边是寝室干燥的暖气。 进了大学,有的人很久才联系一次...
    尘榭阅读 267评论 0 0

友情链接更多精彩内容