天天看點

事務的一些基本常識事務小結

事務小結

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

注意:更高的隔離級别能解決上一級的問題,隔離級别越高安全性越高,并發越低,執行效率越低。

隔離級别的原理:

  1. 讀未送出(RU): 有行級的鎖,沒有間隙鎖。它與RC的差別是能夠查詢到未送出的資料。
  2. 讀已送出(RC):有行級的鎖,沒有間隙鎖,讀不到沒有送出的資料。
  3. 可重複讀(RR):有行級的鎖,有間隙鎖,每次讀取的資料都是一樣的,沒有幻讀的情況。
  4. 序列化(S):有行級鎖,也有間隙鎖,讀表的時候,就已經上鎖了