事務是由乙個或者一組sql組成的執行單元。事務具有acid特性:
atomicity(原子性):同乙個事務裡要麼全部提交,要麼全部回滾,不能只有一部分成功或者一部分回滾。如果在事務執行過程
中發生了錯誤,那麼就要通過undo log將事務回滾到開始時的狀態。
consistency(一致性):事務和資料要保持一致性。提交的事務,那麼對應的資料也要做出相應的同步修改。例如:innodb
crash recovery的時候,日誌已經寫完,那麼對應的事務也要提交,否則對應的事務必須得回滾掉,這樣才能保證innodb
儲存引擎奔潰恢復前後的狀態一致;另一種情況,當事務提交,對應的資料頁要刷入磁碟的時候,innodb會通過doublewrite
buffer來保證資料刷盤的安全性。否則如果事務成功提交,資料頁刷盤出現斷裂,那麼innodb的一致性將會被破壞。
isolation(隔離性):每個session所對應的操作和其他的session應該互不影響,互相隔離。如果發生衝突,那麼innodb會通過
行鎖來進行相應的控制。
durability(永續性):事務所對應的操作最後都必將要持久化到磁碟檔案。innodb_flush_logs_at_trx_commit、sync_binlog等
引數的設定來控制持久化的時機。
上面了解了事務的四個特性,下面看一下innodb開啟事務的方式:
start transaction (read write | read only | with consistent snapshot):start transaction with consistent snapshot就是在做邏輯備份
時用到的開啟乙個一致性快照讀的事務。預設開啟乙個讀寫事務。
begin /begin work
結束乙個事務方式:
1,事務提交
commit;
開啟乙個新的事務(start tracsaction、begin、ddl);
set autocommit=1;
2,事務回滾
rollback;
連線斷開、超時斷開、被kill、宕機。
針對set autocommit=0好處就是多個sql提交時,不會每個sql都提交一次,提公升事務的效率。但是壞處就是有些事務忘記提交,
鎖一直不釋放,其他事務就會長期的鎖等待,影響tps。
接著看一下innodb的四種隔離級別:
read uncommitted(讀未提交):能讀到其他session未提交的事務。髒讀。
read committed(讀提交):只能讀到其他session已經提交的事務。不可重複讀/幻讀。
repeatable read(可重複讀):乙個session中乙個事務裡讀到的資料始終一樣(該事務不對該資料做出修改)。
serializable(序列):讀和寫操作都不能同時執行,只能序列操作。
對於髒讀、不可重複讀、幻讀,下圖可以很明顯看出三種現象的區別:
選擇什麼樣的隔離級別,主要看我們的業務需求。如果業務允許幻讀/不可重複讀的發生,那麼選擇rc隔離級別,減少鎖的粒
度,增加伺服器的qps;如果業務不允許幻讀/不可重複讀的發生,那麼只能選擇rr隔離級別。
事務及事務隔離級別
什麼是事務 事務是訪問資料庫的乙個操作序列,資料庫應用系統通過事務集來完成對資料庫的訪問。事務的正確執行使得資料庫從一種狀態轉換為另一種狀態。事務必須服從iso iec所制定的acid原則。acid是原子性 atomicity 一致性 consistency 隔離性 isolation 永續性 du...
事務及事務隔離級別
事務是訪問資料庫的乙個操作序列,資料庫應用系統通過事務集來完成對資料庫的訪問。事務的正確執行使得資料庫從一種狀態轉換為另一種狀態。事務必須服從iso iec所制定的acid原則。acid是原子性 atomicity 一致性 consistency 隔離性 isolation 永續性 durabili...
事務及事務隔離級別
事務是訪問資料庫的乙個操作序列,資料庫應用系統通過事務集來完成對資料庫的訪問。事務的正確執行使得資料庫從一種狀態轉換為另一種狀態。事務必須服從iso iec所制定的acid原則。acid是原子性 atomicity 一致性 consistency 隔離性 isolation 永續性 durabili...