同乙個應用程式中的多個事務或不同應用程式中的多個事務在同乙個資料集上併發執行時, 可能會出現許多意外的問題,這些問題可分為如下三種型別:
根據實際需求,通過設定資料庫的事務隔離級別可以解決多個事務併發情況下出現的髒讀、不可重複讀和幻讀問題,資料庫事務隔離級別由低到高依次為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(序列化):可以避免髒讀、不可重複讀和幻讀,但是併發性極低,一般很少使用。注意:該隔離級別在讀寫資料時會鎖住整張表。
總結:
說明:√表示可能出現,×表示不會出現
注意:隔離級別越高,越能保證資料的完整性和一致性,但是對併發效能的影響也越大。
mysql事務隔離級別
檢視:mysql資料庫支援read uncommitted、read committed、repeatable read和serializable四種事務隔離級別,預設為repeatable read,可以通過如下語句檢視mysql資料庫事務隔離級別:
#可選引數有:read-uncommitted, read-committed, repeatable-read, serializable.
[mysqld]
transaction-isolation = read-uncommitted
②、重啟mysql服務
2、當前session修改,登入mysql資料庫後執行如下命令:
set session transaction isolation level read uncommitted;
事務隔離級別
1 serializable 最嚴格的spring事務隔離級別,事務序列執行,資源消耗最大 3 read committed 大多數主流資料庫的預設spring事務隔離等級,保證了乙個事務不會讀到另乙個並行事務已修改但未提交的資料,避免了 髒讀取 該級別適用於大多數系統。4 read uncommi...
事務隔離級別
四種隔離級別 隔離級別 髒 讀不可重複讀取 幻 像讀操作未提交 read uncommitted 是是 是讀操作已提交 read committed 否是 是可重複讀 repeatable read 否否 是快照否否 否可序列讀 serializable 否否 否 sql server 還支援使用行...
事務隔離級別
需要防止的現象和事務隔離級別 ansi iso sql 標準 sql92 定義了四種事務隔離級別 transaction isolation level 這四種隔離級別所能提供的事務處理能力各不相同。這些事務隔離級別是針對三種現象定義的,在併發事務執行時,需要阻止這三種現象 中的一種或多種發生。三種...