1. 程式人生 > 其它 >SQL的事務

SQL的事務

SQL的事務

在我們現實生活中,都會經歷不少的挫折,一個人的一生中,絕對不會是一帆風順,人生的路就如小河一樣彎彎曲曲。這個時候,我們應該怎麼辦呢?是逃避?或投降?還是視而不見?這樣都不行,我們需要的是--勇敢的奮鬥。

什麼是事務

資料庫事務(Database Transaction),是指作為單個邏輯工作單元執行的一系列操作,要麼完全地執行,要麼完全地不執行。

簡單的說:事務就是將一堆的SQL語句(通常是增刪改操作)繫結在一起執行,要麼都執行成功,要麼都執行失敗,即都執行成功才算成功,否則就會恢復到這堆SQL語句執行之前的狀態。

事務的四個特性ACID

原子性(Atomicity,或稱不可分割性)、一致性(Consistency)、隔離性(Isolation,又稱獨立性)、永續性(Durability)

  • 原子性: 一個事務(transaction)中的所有操作,要麼全部完成,要麼全部不完成,不會結束在中間某個環節。事務在執行過程中如果發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。
  • 一致性: 在事務開始之前和事務結束以後,資料庫的完整性沒有被破壞。這表示寫入的資料必須完全符合所有的預設規則,這包含資料的精確度、串聯性以及後續資料庫可以自發性地完成預定的工作。
  • 隔離性: 資料庫允許多個併發事務同時對其資料進行讀寫和修改的能力,隔離性可以防止多個事務併發執行時由於交叉執行而導致資料的不一致。
  • 永續性: 事務處理結束後,對資料的修改就是永久的,即便系統故障也不會丟失。

隔離級別

  • 讀未提交(Read uncommitted) 安全性最差,可能發生併發資料問題,效能最好
  • 讀提交(read committed) Oracle預設的隔離級別
  • 可重複讀(repeatable read)MySQL預設的隔離級別,安全性較好,效能一般
  • 序列化(Serializable) 表級鎖,讀寫都加鎖,效率低下,安全性高,不能併發

MySQL的事務處理

  • 在 MySQL 中只有使用了 Innodb 資料庫引擎的資料庫或表才支援事務
  • 事務處理可以用來維護資料的完整性,保證成批的 SQL 語句要麼全部執行,要麼全部不執行
  • 事務用來管理 insert、update、delete 語句,因為這些操作才會“破壞”資料,查詢select語句是不會的
  • MySQL預設資料庫的事務是開啟的,執行SQL後自動提交。
  • MySQL的事務也可以改成手動提交,那就有兩個步驟:先開啟,寫完SQL後,再手動提交。

步驟為:

  1. 開啟事務:start transaction;
  2. 需要執行的SQL語句集
  3. 結束事務:commit(提交事務)或rollback(回滾事務)。