
## 什么是事務?
事務是邏輯上的一組操作,要么都執行,要么都不執行
## 事務的四大特性
原子性(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框架的生命周期