![](https://img.kancloud.cn/d9/ed/d9edeb022087974422bcf208791c8a0f_1094x469.png)
## 什么是事务?
事务是逻辑上的一组操作,要么都执行,要么都不执行
## 事务的四大特性
原子性(Atomicity)、一致性(Consistent)、隔离性(Isalotion)、持久性(Durable)**,简称为`ACID`
1. **原子性**:是指事务的原子性操作,**对数据的修改要么全部执行成功,要么全部失败,实现事务的原子性,undo log保证**
2. **一致性**:是指**执行事务前后的状态要一致**,可以理解为数据一致性。**undo log+redo log保证**
3. **隔离性**:侧重指**事务之间相互隔离,不受影响**,这个与事务设置的隔离级别有密切的关系。**锁(共享、排他)+mvcc保证**
4. **持久性**:则是指在**一个事务提交后,这个事务的状态会被持久化到数据库中,也就是事务提交,对数据的新增、更新将会持久化到数据库中。redo log保证**
Mysql默认的隔离级别:**可重复读**。
REPEATABLE-READ(可重读)**事务隔离级别下使用的是Next-Key Lock 锁算法,因此可以避免幻读的产生,这与其他数据库系统(如 SQL Server)是不同的。所以说InnoDB 存储引擎的默认支持的隔离级别是**REPEATABLE-READ(可重读)**已经可以完全保证事务的隔离性要求,即达到了 SQL标准的**SERIALIZABLE(可串行化)
##
## 隔离级别
**读未提交-读提交-可重复读-串行化**,**级别越来越高,隔离也就越来越严实,到最后的串行化,当出现读写锁冲突的时候,后面的事务只能等前面的事务完成后才能继续访问**
1. **读未提交:读取到别的事务还没有提交的数据,从而产生了脏读**。
2. **读提交:读取别的事务已经提交的数据,从而产生不可重复读。**
3. **可重复读:事务开启过程中看到的数据和事务刚开始看到的数据是一样的,从而产生幻读,在Mysql的中通过MVCC多版本控制的一致性视图解决了不可重复读问题以及通过间隙锁解决了幻读问题。**
4. **串行化:对于同一行记录,若是读写锁发生冲突,后面访问的事务只能等前面的事务执行完才能继续访问**。
不可重复读的重点是修改,幻读的重点在于新增或者删除
# MVCC
### 什么是MVCC
MVCC是一种多版本并发控制机制
MVCC中规定**每一行数据都有多个不同的版本,一个事务更新操作完后就生成一个新的版本**
### MVCC是为了解决什么问题
* 大多数的MYSQL事务型存储引擎,如,InnoDB,Falcon以及PBXT都不使用一种简单的行锁机制.事实上,他们都和MVCC–多版本并发控制来一起使用.
* 大家都应该知道,锁机制可以控制并发操作,但是其系统开销较大,而MVCC可以在大多数情况下代替行级锁,使用MVCC,能降低其系统开销.
### MVCC实现
MVCC是通过保存数据在某个时间点的快照来实现的. 不同存储引擎的MVCC. 不同存储引擎的MVCC实现是不同的,典型的有乐观并发控制和悲观并发控制.
### MVCC 具体实现分析(原理)
InnoDB的MVCC,是通过在每行记录后面保存两个隐藏的列来实现的,这两个列,分别保存了这个行的创建时间,一个保存的是行的删除时间。这里存储的并不是实际的时间值,而是系统版本号(可以理解为事务的ID),没开始一个新的事务,系统版本号就会自动递增,事务开始时刻的系统版本号会作为事务的ID.
# 数据库日志
## 1、mysql中的日志文件都有哪些
①重做日志 redo log
②回滚日志 undo log
③二进制日志 bin log
④错误日志 error log
⑤慢查询日志 slow query log
⑥一般查询日志 general log
⑦中继日志 relay log
## Mysql中redolog 和 binlog的作用和区别
①redolog属于物理日志,记录改数据页的更新状态内容
②binlog属于逻辑日志,记录更新的操作语句的原始逻辑
③redolog是循环写,日志的空间大小是固定的;binlog是追加写入,写完一个写下一个,不会进行数据的覆盖
## 作为主从复制和数据恢复使用哪一个?
redo log作为服务器异常宕机后事务数据自动恢复使用,binlog可以作为主从复制和数据恢复使用,binlog没有自动crash-safe的能力
## bin log
作用:用于主从复制,实现主从同步
## redo log
作用:确保日志的持久性,防止在发生故障,脏页未写入磁盘。重启数据库会进行redo log执行重做,达到事务一致性
## undo log
作用:保证数据的原子性,记录事务发生之前的一个版本,用于回滚,innodb事务可重复读和读取已提交 隔离级别就是通过mvcc+undo实现
## relay log
作用:用于数据库主从同步,将主库发来的bin log保存在本地,然后从库进行回放
- 消息队列
- 为什么要用消息队列
- 各种消息队列产品的对比
- 消息队列的优缺点
- 如何保证消息队列的高可用
- 如何保证消息不丢失
- 如何保证消息不会重复消费?如何保证消息的幂等性?
- 如何保证消息消费的顺序性?
- 基于MQ的分布式事务实现
- Beanstalk
- PHP
- 函数
- 基础
- 基础函数题
- OOP思想及原则
- MVC生命周期
- PHP7.X新特性
- PHP8新特性
- PHP垃圾回收机制
- php-fpm相关
- 高级
- 设计模式
- 排序算法
- 正则
- OOP代码基础
- PHP运行原理
- zavl
- 网络协议new
- 一面
- TCP和UDP
- 常见状态码和代表的意义以及解决方式
- 网络分层和各层有啥协议
- TCP
- http
- 二面
- TCP2
- DNS
- Mysql
- 锁
- 索引
- 事务
- 高可用?高并发?集群?
- 其他
- 主从复制
- 主从复制数据延迟
- SQL的语⾔分类
- mysqlQuestions
- Redis
- redis-question
- redis为什么那么快
- redis的优缺点
- redis的数据类型和使用场景
- redis的数据持久化
- 过期策略和淘汰机制
- 缓存穿透、缓存击穿、缓存雪崩
- redis的事务
- redis的主从复制
- redis集群架构的理解
- redis的事件模型
- redis的数据类型、编码、数据结构
- Redis连接时的connect与pconnect的区别是什么?
- redis的分布式锁
- 缓存一致性问题
- redis变慢的原因
- 集群情况下,节点较少时数据分布不均匀怎么办?
- redis 和 memcached 的区别?
- 基本算法
- MysqlNew
- 索引new
- 事务new
- 锁new
- 日志new
- 主从复制new
- 树结构
- mysql其他问题
- 删除
- 主从配置
- 五种IO模型
- Kafka
- Nginx
- trait
- genergtor 生成器
- 如何实现手机扫码登录功能
- laravel框架的生命周期