事務基本定義操作

在菜園平地摔發表於2020-12-19

一、什麼是事務

一個事務是由一條或者多條sql語句組成的不可分割的單元,只有當事務中的所有操作都正常執行完了,整個事務才會被提交給資料庫; 如果有部分事務失敗,那麼事務就要回退到最初的狀態,或者回退到事務操作的任何一個狀態,因此,事務要麼全部成功,要麼全部失敗。
當程式出錯的時候可以通過rollback回到最初的狀態。當確定所有sql語句沒有問題的時候可以執行commit提交,這一步操作回對資料庫造成永續性的影響。
注1:單獨一個sql語句並不能判斷是事務,判斷事務的標準必須可以執行rollback操作或者commit操作。
注2:rollback可以進行設定儲存點,savepoint point1,rollback to point1。操作就是回退到point1所在的位置。

二、事務的特性

事務的特性分為A C I D

  1. 事務的原子性(Atomic):事務是一個不可分割的整體,事務必須有原子性,要麼全部執行,要麼全部不執行。
  2. 事務的一致性(Consistency):一個事務執行之前和執行之後,資料庫必須保持一致性的狀態。資料庫的一致性狀態必由使用者來負責
    ,並由 併發控制機制實現。併發資料帶來的資料不一致包括(髒資料、不可重複讀、幻讀)。打個比方:狂徒張三給隔壁老王轉1萬塊錢,但是還沒提交,然後隔壁老王呢,正好在查銀行餘額,發現多了1萬塊,之後狂徒張三突然覺的,爺憑本事借的錢憑啥還你,於是rollback操作一波,隔壁老王發現1萬不翼而飛,**隔壁。
  3. 事務的隔離性(Isolation):當兩個或者多個事務併發執行時,為了保持資料的安全性,將一個事務內部的操作與其他事務的操作隔離起來,不被其他正在執行的事務所看到。 分為四種級別。
  4. 事務的永續性(Durablity):事務完成後,DBMS保證它對資料庫中的資料的修改是永久性的 。即使資料庫因為故障出錯,也應該能夠恢復資料。

三、事務的操作

  1. 設定隔離級別
  2. 開啟事務
  3. begin
  4. 書寫組成事務的sql語句
  5. 如果事務執行過程中由bug rollback/rollback to 。如果mm欸有bug,就commit!

檢視mysql是否已經關閉自動提交。

1表示沒有關閉 0 表示已經關閉。

查詢事務的隔離級別
select @@tx_isolation
在這裡插入圖片描述

四、事物的隔離

多個事物同時操作可能會產生的問題:髒讀、不可重複讀、虛度。
髒讀(Dirty Read):一個事務讀取了另一個事物未提交的資料。
不可重複讀(NonRepeatable Read):一個事物的操作導致另一個事物前後兩次讀取到不同的資料。
虛讀(PhantomRead):一個事物的操作導致另一個事物前後兩次查詢的結果資料量不同。
不同的隔離級別解決不同的問題。

隔離級別 髒讀 不可重複讀 幻讀
未提交讀 可以 可以 可以
已提交讀 不可以 可以 可以
可重複讀 不可以 不可以 可以
序列化 不可以 不可以 不可以 效率最低

設定隔離級別:

  1. TRANSACTION_NONE。 表示不支援事務
  2. TRANSACTION_READ_UNCOMMITTED。未提交讀。
    說明在提交前一個事務可以看到另一個事務的變化。這樣讀”髒”資料,不可重複讀和虛讀都是被允許的。
  3. TRANSACTION_READ_COMMITTED。已提交讀。
    說明讀取未提交的資料是不允許的。這個級別仍然允許不可重複讀和虛讀產生。
  4. TRANSACTION_REPEATABLE_READ。可重複讀。
    說明事務保證能夠再次讀取相同的資料而不會失敗,但虛讀仍然會出現。
  5. TRANSACTION_SERIALIZABLE。可序列化/序列化。
    是最高的事務級別,它防止讀髒資料,不可重複讀和虛讀。
    set session transaction isolation level Read uncommitted;

相關文章