MySQL事務(一) 事務簡介

2021-10-03 14:42:38 字數 2932 閱讀 4256

事務是資料庫操作的最小工作單元,是一組不可再分割的操作集合,要麼全部執行,要麼全部失敗。

在mysql中,事務是一組具有原子性的sql語句,一組 sql 語句要麼全部執行,要麼全部不執行。

事務支援是在引擎層實現的,只有使用了 innodb 資料庫引擎的資料庫或表才支援事務,myisam引擎不支援事務,事務用來管理 insert,update,delete 語句,同時事務是資料庫系統區別於其他一切檔案系統的重要特性之一。

一般來說,事務是必須滿足以下4個特性(acid):

原子性:乙個事務(transaction)必須被視為乙個不可分割的最小工作單元,整個事務(transaction)中的所有操作,要麼全部提交成功,要麼全部失敗回滾,對於乙個事務來說,不可能只執行其中的一部分操作,這就是事務的原子性。

一致性:資料庫總是從乙個一致性的狀態轉換到另外乙個一致性的狀態,在事務開始之前和事務結束後資料庫資料的完整性沒有被破壞。(比如:使用者a向使用者b轉賬,不可能使用者a扣了錢,使用者b卻沒有收到)

隔離性:乙個事務對資料庫中資料所做的修改,在未提交完成前,對其它事務是不可見的,事務隔離分為不同級別,包括讀未提交(read uncommitted)、讀提交(read committed)、可重複讀(repeatable read)和序列化(serializable)。

永續性:一旦事務提交,則對資料的修改就會永久儲存到資料庫中,即使系統崩潰,修改的資料也不會丟失。

事務a讀取了事務b未提交事務的資料。

事務a多次讀取同一資料,事務b在事務a多次讀取的過程中,對資料作了更新並提交,導致事務a多次讀取同一資料時,結果不一致。

事務a對錶中的資料進行了修改,涉及到表中的全部行。同時,事務b也修改這個表中的資料,向表中插入一行新資料。那麼,事務a發現表中還有自己沒有修改的行,就好象發生了幻覺一樣。

檢視mysql資料庫的隔離級別:

mysql> show variables like 'transaction_isolation';

+-----------------------+-----------------+

| variable_name | value |

+-----------------------+-----------------+

| transaction_isolation | repeatable-read |

+-----------------------+-----------------+

1 row in set (0.01 sec)

mysql的事務隔離級別: 

未提交讀(read uncommited):即髒讀,乙個事務還沒提交,它做的變更就能被其他事務看到。

已提交讀(read commited):乙個事務提交之後,它做的變更才會被其他事務看到。

可重複讀(repeatable read):乙個事務執行過程中看到的資料,總是跟這個事務在啟動時看到的資料是一致的。當然在可重複讀隔離級別下,未提交變更對其他事務也是不可見的。mysql預設隔離級別是可重複讀,innodb儲存引擎在repeatable read事務隔離級別下,使用next-keylock鎖的演算法,因此避免幻讀的產生。

可序列化(serializable):完全序列化讀,在讀取的每一行資料都加鎖,每次都會鎖表,讀寫互相阻塞。對於同一行記錄,「寫」會加「寫鎖」,「讀」會加「讀鎖」。當出現讀寫鎖衝突的時候,後訪問的事務必須等前乙個事務執行完成,才能繼續執行。

innodb引擎對隔離級別支援

事務隔離級別

髒讀不可重複讀

幻讀讀未提交(read uncommited)√√

√讀已提交(read commited)×√

√可重複讀(repeatable read)××

× (innodb不存在幻讀)

序列化(serializable)××

×begin(或start transaction)開始事務。

rollback回滾事務/commit提交事務。

mysql的autocommit代表事務是否自動提交。mysql預設為自動提交,即當begin開始乙個事務後,關閉mysql會話視窗,沒有執行rollback或者commit操作,sql語句會自動提交。當autocommit關閉後(autocommit=0),需要執行commit才會將事務提交,關閉mysql會話後,則不會提交事務。

mysql> show variables like 'autocommit';

+---------------+-------+

| variable_name | value |

+---------------+-------+

| autocommit | on |

+---------------+-------+

1 row in set (0.04 sec)

以上命令來檢視當前事務提交狀態,value列的on表示當前為自動提交狀態。

執行set autocommit=0; 關閉自動提交事務。(autocommit : 0 為關閉,1為開啟)

mysql> set autocommit=0;

事務(一) 事務概念入門

事務 transaction 是由一系列對系統中資料進行訪問與更新的操作所組成的乙個程式執行線邏輯單元 是指作為單個邏輯工作單元執行的一系列操作,要麼完全地執行,要麼完全地不執行。事務處理可以確保除非事務性單元內的所有操作都成功完成,否則不會永久更新面向資料的資源。通過將一組相關操作組合為乙個要麼全...

MYSQL常見概念一 事務

定義 簡而言之是乙個sql或者是多個sql的操作集,在執行過程中,要麼都成功,要麼都失敗 特點 事務有四大特性 原子性 整個事務包含的sql要麼都執行成功,要麼都失敗 一致性 資料庫在事務執行前與執行後是一致的,資料能夠對的上 隔離性 多個事務之間不相互影 響 永續性 事務一旦完成,對資料庫的影響是...

一 事務的操作

事務是指使用者定義的乙個資料庫操作序列,這些操作要麼全做要麼全不做,它是乙個不可分割的工作單位。乙個事務可以是一條sql語句,一組sql語句,或整個程式。public bool transactionop 開始事務 transaction cn.begintransaction cmd.transa...