https://www.jianshu.com/p/4a344bb75d36(简书连接地址)
1.标准事务控制语句
begin / start transaction; 开启事务
commit; 提交事务
rollback; 回滚事务
2. 自动提交功能
在autocommit=1 的时候, 没有begin(没有显示的开启事务)
在你执行dml语句时, 会自动在这个DML之前加一个begin,
begin; --> 自动
delete ...
commit; ---> 自动
begin; ---> 自动
update 。。。。。
commit; ---> 自动
应用场景:
autocommit, 一般使用于飞交易类业务场景
方案1:
autocommit =0; commit, 手工提交才生效
方案2:
autocommit=1;
每次想要发生事务型操作。
begin 和 commit 都是红狗操作
设置方法:
(1)临时生效:
mysql> set global autocommit=0;
重新开启会话生效
(2)永久生效
vim /etc/my.cnf
autocommit=0
重启数据库生效
3.隐式事务控制语句
4. 隐式回滚
会话关闭
数据库宕机
事务执行语句失败
5. InnoDB 事务的ACID如何保证
redo log 重做日志
数据页存储位置:
ibd:
buffer pool
LSN: 日志序列号
WAL
脏读
CKPT
TXID
UNDO: ibdatal ,存储了事务工作过程中的回滚信息
7. 隔离级别和锁机制
作用: 主要是提供I 的特性, 另外对于C的特性也要保证
a. transaction_isolation 事务隔离性介绍
RU: 读未提交
RC: 读已提交
RR: 可重复复读
SR: 可串行化
读是什么意思:
这里的读不代表select, 而指得是存储引擎的读,是page的读取
b. 隔离级别说明
RU: 读未提交(READ-UNCOMMITED)
出现的问题: 脏页读,不可重复读, 幻读
RC: 读已提交 (READ-COMMITED)
出现的问题: 不可重复读, 幻读
RR:可重复读 (REPEATABLE READ)
出现的问题: 有可能出现幻读,通过一些手段100% 防止
SR: 可串行化 (SERIALIZABLE)
串行化事务, 以上问题都能规避,但是不利于事务的并发
c.参数修改
mysql> select @@transaction_isolation;
临时调整;
mysql> set global transaction_isolation = 'read-uncommited';
重启会话生效
永久修改;
vim /etc/my.cnf
transaction_isolation= 'read-uncommitted'
d. 例子演示:
脏读
对于脏读,在生产业务中是不允许的
不可重复读现象
对于事务的隔离性和数据最终一致性要求比较高的业务
幻觉
在一个事务窗口中,更新操作,出现了别的插入数据的 幻行
调整成transaction_isolation = 'REPEATABLE-READ'
1.防止不可重复读现象:
利用的就是 Undo 的一致性快照读。 MVCC中重要功能
2. 通过RP, 已经可以解决99以上的幻读的,为了更加严谨,加入GAP锁,next-lock
8 MySql 的锁机制
1.1 作用
保证事务之间的隔离性, 也保证数据的一致性
保证资源不会争用
锁时候属于资源的,不是某个事务的特性
1.2 锁类型
资源:
内存锁: mutex ,latch (了解)
对象锁:
MDL(元数据锁), : 修改元数据时, DDL
Table_lock : 表锁, DDL, 备份(FTWRL全局表锁)lock table x read, 也有可能升级为表锁
record(row) lock : 行锁, 索引锁, 锁定聚簇索引
GAP: 间隙锁 , RR 级别,普通辅助索引间隙锁
Next-lock: 下一键锁 GAP+ record
功能分类:
IS : 意向共享锁, 表级别
S: 共享锁,读锁, 行级别
IX: 意向排他锁, 表级别
X: 排他锁, 写锁 , 行级别
8. 事务的一致性ACID的C 的特性
A: 原子性, UNDO, REDO
D: 持久性, commit的数据, Rddo(WAL)
I: 隔离性, ISOLATION_Level, Lock, MVCC(UNDO)
C: 一致性,
所以C的特性是以上所有特性都来保证一致性的。
写一致性: UNDO, REDO, ISO, LOCK
读一致性: ISOLATION LEVEL, MVCC(UNDO)
数据夜的一致性:
double write buffer
9. 存储引擎核心参数
双一标准之一: redo log 刷写参数
(a)innodb_flush_log_at_trx_commit= 1/0/2
(b)innodb_flush_method=fsync/O_DIRECT/O_DYNC
作用: 控制向磁盘刷数据的时是否用OS Cache
fsync的特性:
buffer pool 的数据写磁盘的时候,需要经历OS Cache ,然后写入磁盘
redo buffer: 的数据写磁盘的时候,需要经历OS Cache ,然后写入磁盘
O_DYNC:
buffer pool 的数据写磁盘的时候,需要先经历os cache ,然后在写入磁盘
redo buffer 的数据写磁盘的时候,直接写到磁盘,跨过OS Cache
O_DIRECT:
buffer pool 的数据写磁盘的时候,直接写到磁盘
redo buffer: 的数据写磁盘的时候,需要经历OS Cache ,然后写入磁盘
建议使用o_direct,最好配合固态硬盘
(c)innodb_buffer_pool_size
作用: 数据缓冲区的总大小。缓冲数据页和索引页,是mysql 最大的内存区域。
默认 128M
管方建议: 80-90% 物理内存
生产建议: 75% 一下, 按需分配
show engine innodb status
set global innodb_buffer_pool_size= 402653184;