乙個或者一組 sql 語句組成乙個執行單元,這個執行單元要麼全部執行,要麼全部都不執行,在這個單元中每個 sql 語句都是相互依賴的。整個單元作為乙個不可分割的整體,如果單元中的某條 sql 語句一旦執行失敗或者產生錯誤,整個單元將會回滾。所有受影響的資料將返回到事務開始前的狀態,如果單元中的所有 sql 語句均執行成功,則事務被順利執行。
一、原子性 (atomicity)
原子性指的是事務是乙個不可分割的工作單位,事務中的操作要麼都發生,要麼都不發生。
二、一致性 (consistency)
事務必須使資料庫從乙個一致性狀態變換到另外乙個一致性狀態。比如,轉賬前和轉賬後兩個賬戶的金額是一致性狀態。
三、隔離性 (isolation)
事務的隔離性是指乙個事務的執行不能被其他事務干擾,即乙個事務內部的操作及使用的資料對併發的其他事務是隔離的,併發執行的各個事務之間不能相互干擾。
四、永續性 (durability)
永續性是指乙個事務一旦被提交,它對資料庫中資料的改變就是永久性的,接下來的其他操作和資料庫故障不應該對其有任何影響。
一、隱式事務
事務沒有明顯的開啟和結束的標記,比如 select、insert、update、delete 語句,只要執行這些語句,就相當於開啟了乙個事務,執行完畢後,事務就提交結束了,一條語句就是乙個事務。
二、顯式事務
事務具有明顯的開啟和結束的標記,前提必須設定自動提交功能為禁用 (set autocommit=0
)。
書寫步驟:
# 步驟1:開啟事務
set autocommit =0;
start
transaction
;# 步驟2:編寫事務中的 sql 語句 (select、insert、update、delete)
# 步驟3:結束事務 (提交和回滾二選一)
commit
;# 提交事務
rollback
;# 回滾事務
一、併發問題
對於同時執行的多個事務,當這些事務訪問資料中相同的資料時,如果沒有採取必要的隔離機制,就會導致各種併發問題:
髒讀:對於兩個事務,t1 和 t2,t1 讀取了已經被 t2 更新但還沒有被提交但字段,之後如果 t2 回滾,t1 讀取但內容就是臨時且無效的。(被打錢看見餘額後對方又撤回了)
不可重複讀:對於兩個事務 t1 和 t2,t1 讀取了乙個字段,然後 t2 更新了該字段,之後 t1 再次讀取同乙個字段,值就不同了。(重在更新)
幻讀:對於兩個事務 t1 和 t2,t1 從乙個表中讀取了乙個字段,然後 t2 在該表中插入了一些新的資料,如果 t1 再次讀取同乙個表就會多出幾行記錄。(重在增刪)
二、資料庫事務的隔離性
資料庫系統必須具有隔離併發執行各個事務的能力,使它們不會相互影響,避免各種併發問題。
三、隔離級別
乙個事務與其他事務的隔離程度稱為隔離級別。資料庫規定了多種事務隔離級別,不同隔離級別對應不同的干擾程度,隔離級別越高,資料一致性就越好,但併發性越弱。
隔離級別
描述read uncommitted(讀未提交資料)
允許事務讀取未被其他事務提交的變更,髒讀、不可重複讀和幻讀的問題都會出現
read commited(讀已提交資料)
只允許事務讀取已經被其他事務提交的變更,可以避免髒讀,但是不可重複讀和幻讀問題仍然可能出現
repeatable read(可重複讀)
確保事務可以多次從乙個欄位中讀取相同的值,在這個事務持續期間,禁止其他事務對這個字段進行更新,可以避免髒讀和不可重複讀,但是幻讀的問題仍然存在
serializable(序列化)
確保事務可以從乙個表中讀取相同的行,在這個事務持續期間,禁止其他事務對該錶執行更新、刪除、插入操作,所有併發問題都可以避免,但是效能十分低下
mysql 支援上訴四種隔離級別,預設情況下為repeatable read
。
事務控制語言 TCL
概念 乙個或一組sql語句組成的執行單元,執行單元所有sql語句要麼全執行,要麼全不執行。栗子 張三給李四轉賬。張三 賬戶1000元。李四 賬戶1000元。update 表 set 張三賬戶 500 where name 張三 資料庫中途異常.update 表 set 李四賬戶 1500 where...
mysql基礎 事務TCL
2 事務的建立 2 事務的隔離級別 事務 乙個或一組sql語句組成乙個執行單元,這個執行單元要麼全部執行,要麼全部不執行。事務由單獨單元的 個或多個sql語句組成,在這個單元中,每個mysql語句是相互依賴的。而整個單獨單元作為乙個不可分割的整體,如果單元中某條sql語句一且執行失敗或產生錯誤,整個...
07 TCL 事務控制語言
定義 乙個事務是乙個完整的業務邏輯單元,不可再分。例如 銀行轉賬,從a賬戶向b賬戶轉賬1000,需要執行兩條update語句 update t act set balance balance 1000 where actno act 001 update t act set balance bala...