1. 程式人生 > 其它 >MySQL筆記七:DML——事務

MySQL筆記七:DML——事務

7.1事務的含義 事務是一個完成的業務邏輯,比如從A賬戶向B賬戶轉賬1000元,則將A賬戶的錢減去1000,B賬戶的錢加上1000 以上的操作是一個最小的工作單元,不可再分,要麼同時成功,要麼同時失敗,這樣才能保障錢是對的   7.2只有DML才有事務這一項,和其他語句無關 insert delete update 正是因為做某件事的時候,需要多條DML語句聯合起來才能實現,因此需要事務的存在,事務就是批量的DML語句同時成功或同時失敗。   7.3如何實現事務 InnoDB儲存引擎:提供一組用來記錄事務活動的日誌檔案 在事務的執行過程中,每一天DML的操作都被記錄在日誌檔案中,我們可以提交事務也可以回滾事務。
提交事務:清空事務性活動的日誌檔案,將資料完全徹底地表現在資料庫中,提交意味著事務的結束,是全部成功的結束。 回滾事務:將之前所有的DML操作全部撤銷,並且清空事務性活動的日誌檔案,回滾意味著事務的結束,是全部失敗的結束。   7.4提交事務和回滾事務 提交事務commit 回滾事務rollback mysql在預設情況下是支援自動提交(每一條語句自動執行一次commit)的,這種自動提交實際上是不符合我們的開發習慣的,那麼怎麼關閉自動提交機制呢?   先執行:start transaction; 再執行:一條或多條DML語句 最後執行:commit;或rollback;//回滾只能跳到上一次提交的位置
  7.5事務的特性
  • 原子性:事務是最小的工作單元,不可再分
  • 一致性:在同一個事務中,必須所有操作同時成功或同時失敗
  • 隔離性:事務A和事務B之間有一定的隔離性,一張表有多個事務,相當於多執行緒操作
  • 永續性:事務最終結束的一個保障,事務提交就相當於將沒有儲存到硬碟上的資料正式儲存到硬碟上
  事務的隔離性,隔離級別有四個:
    • 讀未提交:read uncommitted(最低級別)
                事務A可以讀到事務B中未提交的資料,我們稱為髒讀現象(dirty read),這種隔離級別一般不用
  • 讀已提交:read committed
                            事務A只可以讀到事務B中已提交的資料,解決了髒讀現象,但是缺點是不可重複讀取資料(事務 
                             開啟之後,第一次讀到的資料可能是3條,第二次讀取的時候是4條,事務每次讀取的結果不一                               樣),這種隔離級別讀到的都是真實的資料,因此orcle中預設的隔離級別是read committed
  • 可重複讀:repeated read
                            事務A開啟之後,只要事務不結束,不管是多久,每一次在事務A中讀取到的資料都是一致的,                             儘管事務B已經將資料修改了,這就是可重複讀。優點是解決了不可重複讀取資料的問題,                             缺點是可能會出現幻影,每一次讀取都是事務A剛開啟時的資料情況                             mysql中預設的事務隔離級別是repeated read
  • 序列化/序列化:serializable(最高級別)
                            這種隔離級別最高,效率最低,解決了所有問題。                             這種隔離級別表示事務排隊,多個事務不能併發, 7.6驗證各種隔離級別 檢視隔離級別:select @@tx_isolation; 設定隔離級別: set global transaction isolation level read uncommitted;    (設定好之後需要退出一下重新登入mysql)   驗證:read uncommitted 開兩個視窗,兩個start transaction,觀察在執行DML語句的過程中,使用查詢語句觀察讀取到的資訊的變化   驗證:read committed 驗證:repeated read 驗證:serializable