天天看點

Mysql事務前言一、事務的概念二、資料庫中的事務三、資料庫事務的操作總結

文章目錄

  • 前言
  • 一、事務的概念
  • 二、資料庫中的事務
    • 1.事務的特性 ACID
    • 2.事務的隔離級别
  • 三、資料庫事務的操作
    • 1.什麼情況下會出現事務
    • 2.開啟事務(取消自動送出) 、復原事務、送出事務
  • 總結

前言

一個事務是一個完整的業務邏輯單元,不可再分。可以了解為一件完整的事情。

提示:以下是本篇文章正文内容,下面案例可供參考

一、事務的概念

事務指邏輯上的一組操作,組成這組操作的各個單元,要不全部成功,要不全部不成功。

例如,A向B轉賬100,會其中要扣除A賬戶100,然後增加B賬戶100,這兩步要麼都成功,要麼都失敗,否則會出現問題

二、資料庫中的事務

1.事務的特性 ACID

事務包含四大特性:原子性、一緻性、隔離性、持久性。

  • 原子性(Atomicity)

    原子性是指事務是一個不可分割的工作機關,事務中的操作要麼全部成功,要 麼全部失敗。比如在同一個事務中的SQL語句,要麼全部執行成功,要麼全部執行失敗

  • 一緻性(Consistency)

    官網上事務一緻性的概念是:事務必須使資料庫從一個一緻性狀态變換到另外一個一緻性狀态。以轉賬為例子,A向B轉賬,假設轉賬之前這兩個使用者的錢加起來總共是2000,那麼A向B轉賬之後,不管這兩個賬戶怎麼轉,A使用者的錢和B使用者的錢加起來的總額還是2000,這個就是事務的一緻性。

  • 隔離性(Isolation)

    事務的隔離性是多個使用者并發通路資料庫時,資料庫為每一個使用者開啟的事務,不能被其他事務的操作資料所幹擾,多個并發事務之間要互相隔離。

  • 持久性(Durability)

    持久性是指一個事務一旦被送出,它對資料庫中資料的改變就是永久性的,接下來即使資料庫發生故障也不應該對其有任何影響

      

    注意:事務的四大特性中最麻煩的是隔離性,下面重點介紹一下事務的隔離級别

2.事務的隔離級别

引用自這篇文章

  • 串行化(Serializable,SQLite預設模式):最進階别的隔離。兩個同時發生的事務100%隔離,每個事務有自己的"世界", 串行執行。
  • 可重複讀(Repeatable read,MySQL預設模式):如果一個事務成功執行并且添加了新資料(事務送出),這些資料對其他正在執行的事務是可見的。但是如果事務成功修改了一條資料,修改結果對正在運作的事務不可見。是以,事務之間隻是在新資料方面突破了隔離,對已存在的資料仍舊隔離。
  • 讀取已送出(Read committed,Oracle、PostgreSQL、SQL Server預設模式):可重複讀+新的隔離突破。如果事務A讀取了資料D,然後資料D被事務B修改(或删除)并送出,事務A再次讀取資料D時資料的變化(或删除)是可見的。這叫不可重複讀(non-repeatable read)。
  • 讀取未送出(Read uncommitted):最低級别的隔離,是讀取已送出+新的隔離突破。如果事務A讀取了資料D,然後資料D被事務B修改(但并未送出,事務B仍在運作中),事務A再次讀取資料D時,資料修改是可見的。如果事務B復原,那麼事務A第二次讀取的資料D是無意義的,因為那是事務B所做的從未發生的修改(已經復原了嘛)。這叫髒讀(dirty read)

    事務的隔離級别對應的sql操作

    1.檢視事務隔離級别
    	SHOW VARIABLES LIKE 'tx_isolation';
    2.檢視全局事務隔離級别
    	SHOW GLOBAL VARIABLES LIKE 'tx_isolation';
    3.使用系統變量查詢
    	SELECT @@global.tx_isolation; SELECT @@session.tx_isolation; SELECT @@tx_isolation;
    4.設定Mysql的事務隔離級别
    	GLOBAL:設定全局的事務隔離級别 SESSION:設定目前session的事務隔離級别,如果語句沒有指定GLOBAL或SESSION,預設值為SESSION
    	SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL
      	{
            REPEATABLE READ  可重複讀
           | READ COMMITTED   讀取已送出
           | READ UNCOMMITTED 讀取未送出
           | SERIALIZABLE      串行化
       	}
    5.使用系統變量設定事務隔離級别
    SET GLOBAL tx_isolation='REPEATABLE-READ'; SET SESSION tx_isolation='SERIALIZABLE';
               

三、資料庫事務的操作

首先明确一點,Mysql 資料庫預設事務是自動送出的。

1.什麼情況下會出現事務

預設情況下,一條DML(增删改)語句就是一個事務。或者手動開啟 一個事務 。

2.開啟事務(取消自動送出) 、復原事務、送出事務

1.開啟事務後,此事務的自動送出會關閉,需以復原事務,或送出事務來結束事務
	start transaction;
2.復原事務,是指撤銷【開啟事務】至【復原事務】之間的所有DML操作
	rollback;
3.送出事務,是指将【開啟事務】至【送出事務】之間的所有DML操作執行并持久化到資料庫
	commit;
           

總結

關于事務的優秀文章推薦此連結