天天看點

MySQL|MySQL事物以及隔離級别

MySQL 事務主要用于處理操作量大,複雜度高的資料。比如開單,需要添加給訂單表增加記錄,還需要增加訂單的各種相關明細,操作複雜度高,這些操作語句需要構成一個事務。在 MySQL 指令行的預設設定下,事務都是自動送出的,即執行 SQL 語句後就會馬上執行 COMMIT 操作。是以要顯式地開啟一個事務務須使用指令 BEGIN 或 START TRANSACTION,或者執行指令 SET AUTOCOMMIT=0,用來禁止使用目前會話的自動送出。

1、事務及其四大特性

  • 在 MySQL 中隻有使用了 Innodb 資料庫引擎的資料庫或表才支援事務
  • 事務處理可以用來維護資料庫的完整性,保證成批的 SQL 語句要麼全部執行,要麼全部不執行。
  • 一般來說,事務需要滿足4個條件(ACID):原子性(Atomicity)、一緻性(Consistency)、隔離性(Isolation)、持久性(Durability)
  • mysql預設是自動送出事務的

1.1原子性

一個事務(transaction)中的所有操作,要麼全部完成,要麼全部不完成,不會結束在中間某個環節。事務在執行過程中發生錯誤,會被復原(Rollback)到事務開始前的狀态,就像這個事務從來沒有執行過一樣。

1.2一緻性

在事務開始之前和事務結束以後,資料庫的完整性沒有被破壞。這表示寫入的資料必須完全符合所有的預設規則,這包含資料的精确度、串聯性以及後續資料庫可以自發性地完成預定的工作。

1.3隔離性

資料庫允許多個并發事務同時對其資料進行讀寫和修改的能力,隔離性可以防止多個事務并發執行時由于交叉執行而導緻資料的不一緻。事務隔離分為不同級别,包括讀未送出(Read uncommitted)、讀送出(read committed)、可重複讀(repeatable read)和串行化(Serializable)。

1.4持久性

事務處理結束後,對資料的修改就是永久的,即便系統故障也不會丢失。

2、事務的隔離級别

隔離級别

髒讀(Dirty Read)

不可重複讀(NonRepeatable Read)

幻讀(Phantom Read)

未送出讀(Read uncommitted)

可能

已送出讀(Read committed)

不可能

可重複讀(Repeatable read)

可串行化(Serializable )

InnoDB預設是可重複讀級别的

  • 髒讀: 髒讀就是指當一個事務正在通路資料,并且對資料進行了修改,而這種修改還沒有送出到資料庫中,這時,另外一個事務也通路這個資料,然後使用了這個資料。
  • 不可重複讀:是指在一個事務内,多次讀同一資料。在這個事務還沒有結束時,另外一個事務也通路該同一資料。那麼,在第一個事務中的兩次讀資料之間,由于第二個事務的修改,那麼第一個事務兩次讀到的的資料可能是不一樣的。這樣就發生了在一個事務内兩次讀到的資料是不一樣的,是以稱為是不可重複讀。
  • 幻讀:第一個事務對一個表中的資料進行了修改,這種修改涉及到表中的全部資料行。同時,第二個事務也修改這個表中的資料,這種修改是向表中插入一行新資料。那麼,以後就會發生操作第一個事務的使用者發現表中還有沒有修改的資料行,就好象發生了幻覺一樣,幻讀是資料行記錄變多了或者少了。

差別:髒讀是指讀取了未修改完的記錄,不可重複讀指因為被其它事務修改了記錄導緻某事務兩次讀取記錄不一緻,而幻讀是指因為其它事務對表做了增删導緻某事務兩次讀取的表記錄數不一緻問題。

2.1、第1級别未送出讀(Read Uncommitted)

允許髒讀,也就是可能讀取到其他會話中未送出事務修改的資料

2.2、第2級别送出讀(Read Committed)

隻能讀取到已經送出的資料。Oracle等多數資料庫預設都是該級别 (不重複讀)

2.3、第3級别可重複讀(Repeated Read)

可重複讀。在同一個事務内的查詢都是事務開始時刻一緻的,InnoDB預設級别。在SQL标準中,該隔離級别消除了不可重複讀,但是還存在幻象讀

2.4、第4級别串行讀(Serializable)

完全串行化的讀,每次讀都需要獲得表級共享鎖,讀寫互相都會阻塞

3、mysql事務相關指令

3.1檢視mysql系統的事務隔離級别

mysql> SELECT @@global.tx_isolation;

3.2檢視mysql會話的事務隔離級别

mysql> SELECT @@tx_isolation; -- 或 mysql> SELECT @@session.tx_isolation;

3.3設定系統的事務隔離級别

mysql> set global transaction isolation level read committed;

3.4設定會話的事務隔離級别

mysql> set session transaction isolation level read committed; -- 值可以分别為:READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE

3.5檢視autocommit變量

1:表示自動送出事務,0表示不自動送出事務

mysql> select @@autocommit;

3.6設定mysql不自動送出事務

mysql> set autocommit = 0;

3.7事務復原

mysql> rollback;

3.8顯示的開啟一個事務

mysql> start transaction; -- 或 mysql> begin;

3.9建立一個儲存點

mysql> savepoint tem1;

3.10顯示送出事務

mysql> commit;

更多技術資訊請檢視雲掣官網

https://www.dtstack.com/dtsmart/