事務:保證一組數據庫操作,要麼全部成功,要麼全部失敗。MySQL中事務支持在引擎層實現。MySQL是一個支持多引擎的系統,不是所有的MySQL引擎都支持事務。
1.事務ACID原則
Atomicity,Consistency,Isolation,Durability
2.事務隔離級別(多事務數據處理)
讀未提交:可讀取到另一個未提交的事務數據變更,會出現髒讀,不可重複讀。
讀提交:只有事務提交之後,其他事務纔可讀取到它的值;另一個意思:一旦事務提交,其他事務就能讀取到它的值。會出現不可重複讀。
可重複讀:一個事務看到的值,與這個事務啓動時看到的值是一致的。另一個意思:其他事務提交了,如果當前事務沒提交,其他事務的提交對當前事務來講無意義。會出現幻讀:比如一個事務要更新所有的數據,但是另一個事務新增了一條數據,那麼操作第一個事務的人會發現表中還存在沒有修改的一行數據。
串行化:對於同一行數據,事務操作嚴格按順序執行。讀數據加讀鎖,寫數據加寫鎖。
事務隔離級別由上往下性能從高到底,安全性由低到高變化。一般MySQL隔離基本爲可重複讀。
3.事務隔離怎麼實現的?
每次數據修改都記錄一條回滾日誌,如果某個事物需要回滾,會嚴格按照記錄的回滾日誌依次回滾。
4.長事務,短事務。
如果一個事務很長時間不提交,即爲長事務,長事務會導致回滾日誌不刪除,所以儘量不要使用。
5.事務啓動方式
(1)顯示啓動:begin transaction,存在多一次交互問題,即begin語句的開銷,可以使用commit work and chain語法優化。
(2)set autocommit=0。將自動提交關閉,執行select語句時就開啓了事務,需要手動提交事務,否則可能導致長事務問題。