国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

mysql事務指的是哪些

2024-07-24 12:33:28
字體:
來源:轉載
供稿:網友
  數據庫的事務(Transaction)是一種機制、一個操作序列,是訪問和更新數據庫的程序執行單元,包含了一組數據庫操作命令。
 
  首先回顧一下MySQL事務的基礎知識。
 
  1. 邏輯架構和存儲引擎
 
  mysql事務指的是什么
 
   MySQL服務器邏輯架構從上往下可以分為三層:
 
  (1)第一層:處理客戶端連接、授權認證等。
 
  (2)第二層:服務器層,負責查詢語句的解析、優化、緩存以及內置函數的實現、存儲過程等。
 
  (3)第三層:存儲引擎,負責MySQL中數據的存儲和提取。MySQL中服務器層不管理事務,事務是由存儲引擎實現的。MySQL支持事務的存儲引擎有InnoDB、NDB Cluster等,其中InnoDB的使用最為廣泛;其他存儲引擎不支持事務,如MyIsam、Memory等。
 
  如無特殊說明,后文中描述的內容都是基于InnoDB。
 
  2. 提交和回滾
 
  典型的MySQL事務是如下操作的:
 
  start transaction;
  ……  #一條或多條sql語句
  commit;
  其中start transaction標識事務開始,commit提交事務,將執行結果寫入到數據庫。如果sql語句執行出現問題,會調用rollback,回滾所有已經執行成功的sql語句。當然,也可以在事務中直接使用rollback語句進行回滾。
 
  自動提交
 
  MySQL中默認采用的是自動提交(autocommit)模式,如下所示:
 
  mysql事務指的是什么
 
  在自動提交模式下,如果沒有start transaction顯式地開始一個事務,那么每個sql語句都會被當做一個事務執行提交操作。
 
  不過,常用的select、insert、update和delete命令,都不會強制提交事務。
 
  3. ACID特性
 
  ACID是衡量事務的四個特性:
 
  原子性(Atomicity,或稱不可分割性)
  一致性(Consistency)
  隔離性(Isolation)
  持久性(Durability)
  按照嚴格的標準,只有同時滿足ACID特性才是事務;但是在各大數據庫廠商的實現中,真正滿足ACID的事務少之又少。例如MySQL的NDB Cluster事務不滿足持久性和隔離性;InnoDB默認事務隔離級別是可重復讀,不滿足隔離性;Oracle默認的事務隔離級別為READ COMMITTED,不滿足隔離性……因此與其說ACID是事務必須滿足的條件,不如說它們是衡量事務的四個維度。
 
  下面將詳細介紹ACID特性及其實現原理;為了便于理解,介紹的順序不是嚴格按照A-C-I-D。
 
  原子性
  1. 定義
 
  原子性是指一個事務是一個不可分割的工作單位,其中的操作要么都做,要么都不做;如果事務中一個sql語句執行失敗,則已執行的語句也必須回滾,數據庫退回到事務前的狀態。
 
  2. 實現原理:undo log
 
  在說明原子性原理之前,首先介紹一下MySQL的事務日志。MySQL的日志有很多種,如二進制日志、錯誤日志、查詢日志、慢查詢日志等,此外InnoDB存儲引擎還提供了兩種事務日志:redo log(重做日志)和undo log(回滾日志)。其中redo log用于保證事務持久性;undo log則是事務原子性和隔離性實現的基礎。
 
  以update操作為例:當事務執行update時,其生成的undo log中會包含被修改行的主鍵(以便知道修改了哪些行)、修改了哪些列、這些列在修改前后的值等信息,回滾時便可以使用這些信息將數據還原到update之前的狀態。
 
  持久性
  1. 定義
 
  持久性是指事務一旦提交,它對數據庫的改變就應該是永久性的。接下來的其他操作或故障不應該對其有任何影響。
 
  2. 實現原理:redo log
 
  redo log和undo log都屬于InnoDB的事務日志。下面先聊一下redo log存在的背景。
 
  InnoDB作為MySQL的存儲引擎,數據是存放在磁盤中的,但如果每次讀寫數據都需要磁盤IO,效率會很低。為此,InnoDB提供了緩存(Buffer Pool),Buffer Pool中包含了磁盤中部分數據頁的映射,作為訪問數據庫的緩沖:當從數據庫讀取數據時,會首先從Buffer Pool中讀取,如果Buffer Pool中沒有,則從磁盤讀取后放入Buffer Pool;當向數據庫寫入數據時,會首先寫入Buffer Pool,Buffer Pool中修改的數據會定期刷新到磁盤中(這一過程稱為刷臟)。
 
  Buffer Pool的使用大大提高了讀寫數據的效率,但是也帶了新的問題:如果MySQL宕機,而此時Buffer Pool中修改的數據還沒有刷新到磁盤,就會導致數據的丟失,事務的持久性無法保證。
 
  于是,redo log被引入來解決這個問題:當數據修改時,除了修改Buffer Pool中的數據,還會在redo log記錄這次操作;當事務提交時,會調用fsync接口對redo log進行刷盤。如果MySQL宕機,重啟時可以讀取redo log中的數據,對數據庫進行恢復。redo log采用的是WAL(Write-ahead logging,預寫式日志),所有修改先寫入日志,再更新到Buffer Pool,保證了數據不會因MySQL宕機而丟失,從而滿足了持久性要求。

(編輯:武林網)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 华蓥市| 堆龙德庆县| 绥阳县| 定州市| 新乡市| 嘉峪关市| 图片| 玛曲县| 永和县| 靖边县| 张家港市| 平乡县| 大兴区| 合作市| 彭州市| 奉新县| 轮台县| 永德县| 鸡西市| 南丹县| 北票市| 仙桃市| 大名县| 永修县| 长阳| 金华市| 高邮市| 新乡县| 方正县| 新干县| 阳曲县| 商都县| 龙山县| 上蔡县| 望谟县| 安吉县| 安吉县| 南汇区| 页游| 隆德县| 石屏县|