一、在多事務在在相近的時間由多人處理時,此時往往存在一系列併發問題:
1、髒讀(drity read)
已知有兩個事務a和
b, a
讀取了已經被
b更新但還沒有被提交的資料,之後,
b回滾事務,
a讀取的資料就是髒資料
2、不可重複讀(non-repeatable read)
已知有兩個事務a和b
,a 多次讀取同一資料,b 在
a多次讀取的過程中對資料作了修改並提交,導致
a多次讀取同一資料時,結果不一致
3、幻讀(phantom read)
已知有兩個事務a和b
,a從乙個表中讀取了資料,然後
b在該表中插入了一些新資料,導致
a再次讀取同乙個表
, 就會多出幾行,簡單地說,乙個事務中先後讀取乙個範圍的記錄,但每次讀取的紀錄數不同,稱之為幻象讀
注:不可重複讀與幻讀 區別就是在讀取資料是另一方對資料盡行了何種修改:修改和插入
二、處理方法: 事務隔離許可權
根據實際需求,通過設定資料庫的事務隔離級別可以解決多個事務併發情況下出現的髒讀、不可重複讀和幻讀問題,資料庫事務隔離級別由低到高依次為
read uncommitted、read committed、repeatable read和serializable
等四種。資料庫不同,其支援的事務隔離級別亦不相同:
mysql資料庫支援上面四種事務隔離級別,預設為repeatable read;oracle 資料庫支援read committed和serializable兩種事務隔離級別,預設為read committed 1
、read uncommitted
(讀未提交)
:可能出現髒讀、不可重複讀和幻讀。 2
、read committed
(讀提交)
:可以避免髒讀,但可能出現不可重複讀和幻讀。大多數資料庫預設級別就是
read committed
,比如sql server
資料庫和
oracle
資料庫。注意:該隔離級別在寫資料時只會鎖住相應的行。 3
、repeatable read
(重複讀)
:可以避免髒讀和不可重複讀,但可能出現幻讀。注意:①、事務隔離級別為可重複讀時,如果檢索條件有索引(包括主鍵索引)的時候,預設加鎖方式是
next-key
鎖;②、如果檢索條件沒有索引,更新資料時會鎖住整張表。乙個間隙被事務加了鎖,其他事務是不能在這個間隙插入記錄的,這樣可以防止幻讀。 4
、serializable
(序列化)
:可以避免髒讀、不可重複讀和幻讀,但是併發性極低,一般很少使用。注意:該隔離級別在讀寫資料時會鎖住整張表。
注:此處在使用repeatable read(重複讀)
時,由於mysql中的mvcc機制,在進行讀取時僅僅可以讀取由於mvcc記住的機制,因此即時資料被修改,在mysql資料庫中處理的未修改的表:這就意味著在乙個查詢事務期間新增資料,新增的資料是看不到的
三、如何改變預設讀取方式?
1、在mysql資料夾中找到 my.ini 檔案,進行編輯
2、在檔案的最下方新增如下**:
#可選引數有:read-uncommitted, read-committed, repeatable-read, serializable.
[mysqld]
transaction-isolation = repeatable-read
3、在系統管理中結束mysql程式:
事務的隔離級別舉例 事務的隔離級別
乙個事務是乙個完整的業務邏輯單元,不能再分,要麼全部執行成功,要麼全部失敗。比如 a給b轉賬100元,a的銀行卡就會少100元,b的銀行卡就會多100元,整個過程要麼全部執行成功,要麼全部失敗。a 原子性。事務是最小的業務邏輯單元。b 一致性。乙個事務必須保證多條dml語句同時成功或失敗。c 隔離性...
事務的隔離級別舉例 JDBC 事務隔離級別
本文總結了 jdbc 事務隔離級別。事務隔離級別定義了在乙個事務中,哪些資料是對當前執行的語句 可見 的。在併發訪問資料庫時,事務隔離級別定義了多個事務之間對於同個目標資料來源訪問時的可交叉程度。可交叉程度可分為以下幾類。可交叉程度 dirty reads 髒讀 當乙個事務能看見另外乙個事務未提交的...
事務的隔離級別舉例 JDBC事務隔離級別
一組要麼同時執行成功,要麼同時執行失敗的sql語句。是資料庫操作的乙個執行單元。斷開與資料庫的連線 表示乙個事務內的所有操作是乙個整體,要麼全部成功,要麼全部失敗 表示乙個事務內有乙個操作失敗時,所有的更改過的資料都必須回滾到修改前狀態 事務檢視資料時資料所處的狀態,要麼是另一併發事務修改它之前的狀...