事務小結
1.什麼是事務
标準的定義:
事務指的是邏輯上的一組操作,組成這組操作的各個單元要麼全都成功,要麼全都失敗
筆者自己的了解:
從執行效果來看,我們可以将在事務中的多行代碼,看成不可分割的一行代碼,隻要其中一個部分執行不成功,那麼整段代碼都會垮掉;這樣做的作用,就是為了保證多條操作資料庫的sql語句,要麼同時成功,要麼就同時失敗。現實中的應用最常見的就是銀行轉賬案例。
注意:支援事務的資料庫引擎為InnoDB。MyISAM不支援事務。
2.事務的特性
ACID:原子性,一緻性,隔離性,持久性
1.原子性:
事務的原子性是指事務必須是一個原子的操作序列單元,全部執行成功,或全部執行失敗,事務開 始後所作的操作要麼全部做完,要麼全部不做,不可能停滞在中間環節,出錯即復原
2.一緻性
保證資料庫的完整性和一緻性,從A到B轉賬,A-則B一定要+
3.隔離性:
在并發事務互相隔離,互不影響
4.持久性:
事務的持久性是指事務一旦送出就會被刻到CD光牒,永久儲存
注意:隔離級别的設定隻對目前連結有效。對于使用MySQL指令視窗而言,一個視窗就相當于一個連結,目前視窗設定的隔離級别隻對目前視窗中的事務有效;對于JDBC操作資料庫來說,一個Connection對象相當于一個連結,而對于Connection對象設定的隔離級别隻對該Connection對象有效,與其他連結Connection對象無關。
3.事務的操作步驟
顯示事務:
以begin transaction 開始,
中間代碼
以commit 或 rollback 結束
隐式事務:
自動送出,例如DDL(建庫建表語句)
4.事務的隔離級别以及對應的問題
事務共有四種隔離級别,隔離級别依次增高:
讀未送出:READ_UNCOMMITTED, 會造成髒讀
讀已送出:READ_COMMITTED, 會造成不可重複讀
可重複讀:REPEATABLE_READ, 會造成幻讀
順序讀:SERIALIZABLE
注意:更高的隔離級别能解決上一級的問題,隔離級别越高安全性越高,并發越低,執行效率越低。
隔離級别的原理:
- 讀未送出(RU): 有行級的鎖,沒有間隙鎖。它與RC的差別是能夠查詢到未送出的資料。
- 讀已送出(RC):有行級的鎖,沒有間隙鎖,讀不到沒有送出的資料。
- 可重複讀(RR):有行級的鎖,有間隙鎖,每次讀取的資料都是一樣的,沒有幻讀的情況。
- 序列化(S):有行級鎖,也有間隙鎖,讀表的時候,就已經上鎖了