MySQL 事務詳解

2021-10-23 04:06:09 字數 2012 閱讀 6572

mysql 事務主要用於處理操作量大,複雜度高的資料。比如說,在人員管理系統中,你刪除乙個人員,你既需要刪除人員的基本資料,也要刪除和該人員相關的資訊,如信箱、文章等等,這樣,這些眾多的資料庫操作語句就構成乙個事務!

一般來說,事務必須滿足以下 4 個條件(acid)

而我們在學習事務的時候最複雜也是最重要的就是事務的隔離性問題,使用不同的事務隔離級別,在併發事務中就有可能發生髒讀不可重複讀幻讀這些問題。

髒讀(dirty read):某個事務已更新乙份資料,另乙個事務在此時讀取了同乙份資料,由於某些原因,前乙個事務 rollback 了操作,則後乙個事務所讀取的資料就會是不正確的。若事務隔離級別為讀未提交(read uncommitted),那麼就有可能發生髒讀問題。

不可重複讀(nonrepeatable read):在乙個事務的兩次查詢之中有些資料前後兩次不一致,這可能是兩次查詢過程中間,別的事務更改了這些資料並提交了事務。若事務隔離級別為讀已提交(read committed),那麼就有可能發生不可重複讀問題。

幻讀(phantom read):在乙個事務的兩次查詢之中資料條數(rows)不一致,這可能是兩次查詢過程中間,別的事務插入了新資料並提交了事務。若事務隔離級別為可重複讀(repeatable read),那麼就有可能發生幻讀問題。

注:從另乙個角度來說,可重複讀隔離級別限制了在事務讀取期間其他事務不能更改資料,但可以插入資料。

讀未提交(read uncommitted):所有事務都可以看到其他未提交事務的執行結果。本隔離級別很少用於實際應用,因為它的效能也不比其他級別好多少。此隔離級別可能會發生髒讀不可重複讀幻讀

讀已提交(read committed):乙個事務只能看見已經提交事務所做的改變 。即乙個事務在處理期間可能有其他事務進行 update 並 commit,所以該事務再次 select 可能返回不同結果。這就是不可重複讀的意思,當然此隔離級別也可能發生幻讀

可重複讀(repeatable read):不同的事務所做的改變是相互不可見的。但有乙個特別的情況,若此時有新的資料 insert(記住不是 update 操作),該事務再次 select 就會查到新插入的資料。這就是幻讀的意思。

innodb 和 falcon 儲存引擎通過多版本併發控制(mvcc,multiversion concurrency control)機制解決了該問題。

可序列化(serializable):這是最高的隔離級別,它通過強制事務排序,使之不可能相互衝突,從而解決幻讀問題。簡言之,它是在每個讀的資料行上加上共享鎖。在這個級別下,可能導致大量的超時現象和鎖競爭,但不會發生資料不一致的問題。

在 mysql 命令列的預設設定下,事務都是自動提交的,即執行 sql 語句後就會馬上執行 commit 操作,這種稱為隱式事務。因此要顯式地開啟乙個事務務須使用命令 begin 或 start transaction,或者執行命令 set autocommit=0,用來禁止使用當前會話的自動提交。

注1:mysql 預設的事務隔離級別為 repeatable-read。

注2:oracle 預設的事務隔離級別為 read-committed。

1、用 begin,rollback,commit 來實現:

2、直接用 set 來改變 mysql 的自動提交模式:

mysql事務詳解

使用者訪問資料庫時,資料庫會為使用者開啟乙個程序,使用者可以通過這個程序對資料庫進行增 刪 改 查的操作,這個程序就稱為事務。1 原子性 指事務是乙個不可分割的工作單位,事務中的操作要麼都發生,要麼都不發生 例如 在乙個事務中,對t1表新增乙個資料,並對t2表刪除乙個資料,這兩步操作要麼都成功,要麼...

Mysql事務詳解

不可重複讀和幻讀的區別應該在於 不可重複讀是主要是說多次讀取一條記錄,發現該記錄中某些列值被修改過。幻讀是主要是說多次讀取乙個範圍內的記錄 包括直接查詢所有記錄結果或者做聚合統計 發現結果不一致 標準檔案一般指記錄增多,記錄的減少應該也算是幻讀 解決不可重複讀的問題只需鎖住滿足條件的行,解決幻讀需要...

mysql事務詳解

轉至 參考 mysql隔離級別 通俗理解 mysql oracle預設事務隔離級別 簡單點總結下他們的區別 髒讀是指讀取了未修改完的記錄,不可重複讀指因為被其它事務修改了記錄導致某事務兩次讀取記錄不一致,而幻讀是指因為其它事務對錶做了增刪導致某事務兩次讀取的表記錄數不一致問題。1 read unco...