天天看點

MySQL事務

一, 資料庫事務處理

事務處理是将多個操作或者指令一起執行,所有指令全部成功執行才意味着該事務的成功,任何一個指令失敗都意味着該事務的失敗。

是以,事務處理是不是一榮俱榮,而是一毀全毀。

事務的四大特征(ACID)

  • 原子性(A):事務是最小的機關,不可再分
  • 一緻性(C):事務要求所有的DML語句操作的時候,必須保證同時成功或者失敗
  • 隔離性( I ):事務A與事務B之間具有隔離性
  • 持久性(D):是事務的保證,事務終結的标志(記憶體的資料持久到硬碟檔案中)

二,事務語句

● BEGIN | Start Transaction:開啟事務 

● SAVEPOINT 辨別名稱:保留點,每個保留點都表示它的唯一名字,以便以後回退。在MySQL事務中保留點越多越好,這樣能夠按照自己的意願靈活的進行回退。

● ROLLBACK 保留點辨別:復原到指定保留點處 

● ROLLBACK:事務復原,整個事務復原 

● COMMIT;送出事務,COMMIT送出或ROLLBACK復原後會關閉事務。 

● SET AUTOCOMMIT = { 0 | 1 };設定事務自動送出,1自動,0取消自動

● 查詢自動送出功能狀态:SELECT @@AUTOCOMMIT;

事務使用:

BEGIN;#開啟事務
  MDL語句;#事務失敗
ROLLBACK;#事務復原

--------------------------------------------

BEGIN;#開啟事務
  MDL語句;#事務成功
COMMIT;#事務送出      

三,隔離性-隔離級别

事務A與事務B之間具有一定的隔離性

隔離級别 非送出讀取(髒讀) 不可重複讀取 幻想讀

READ UNCOMMITED

讀未送出

READ COMMITED

讀已送出

REPEATABLE READ

可重複讀

SERIALIZABLE

串行化

1)讀未送出:Read Uncommitted

  • 事物A和事物B,事物A未送出的資料,事物B可以讀取到 
  • 這裡讀取到的資料叫做“髒資料” 
  • 這種隔離級别最低,這種級别一般是在理論上存在,資料庫隔離級别一般都高于該級别

2)讀已送出:Read Committed

  • 事物A和事物B,事物A送出的資料,事物B才能讀取到 - 這種隔離級别高于讀未送出 
  • 換句話說,對方事物送出之後的資料,我目前事物才能讀取到 
  • 這種級别可以避免“髒資料” 
  • 這種隔離級别會導緻“不可重複讀取” 
  • Oracle預設隔離級别

3)可重複讀:Repeatable Read

  • 事務A和事務B,事務A送出之後的資料,事務B讀取不到
  • 事務B是可重複讀取資料
  • 這種隔離級别高于讀已送出
  • 換句話說,對方送出之後的資料,我還是讀取不到
  • 這種隔離級别可以避免“不可重複讀取”,達到可重複讀取
  • 比如1點和2點讀到資料是同一個
  • MySQL預設級别
  • 雖然可以達到可重複讀取,但是會導緻“幻像讀”

4)串行化:Serializable

  • 事務A和事務B,事務A在操作資料庫時,事務B隻能排隊等待 
  • 這種隔離級别很少使用,吞吐量太低,使用者體驗差 
  • 這種級别可以避免“幻像讀”,每一次讀取的都是資料庫中真實存在資料,事務A與事務B串行,而不并發

設定隔離級别:

  • 方法一:在my.ini檔案中使用transaction-isolation選項來設定事務伺服器的省缺事務隔離級别,例:transaction-isolation = READ-COMMITTED
  • 方法二:通過動态指令設定隔離級别,在運作的伺服器中動态設定;SET [ GLOBAL | SESSION ] TRANSACTION ISOLATION LEVEL 隔離級别;
  • 隔離級别的作用範圍:
    • GLOBAL:全局級,對所有會話有效;SET GLOBAL TRANSACTION ISOLATION LEVEL 隔離級别;
    • SESSION:會話級,隻對目前會話有效;SET SESSION TRANSACTION ISOLATION LEVEL 隔離級别;

檢視隔離級别:SHOW VARIABLES LIKE 'tx_isolation';