Mysql事務以及四中隔離級別例項2以及InnoDB如何解決當時讀的幻讀問題
第二種情況:
也就是基於上一種情況 事務A在事務B插入資料之前沒有進行select 沒有建立一個當前時間點的快照,
所以事務A ,在事務B 插入資料並提交後 再進行查詢操作就會出現幻讀
InnoDB通過Nextkey lock解決了當前讀時的幻讀問題
Innodb行鎖分為:
型別 —————- 說明
Record Lock: 在索引上對單行記錄加鎖.
Gap Lock: 鎖定一個範圍的記錄,但不包括記錄本身.鎖加在未使用的空閒空間上,可能是兩個索引記錄之間,也可能是第一個索引記錄之前或最後一個索引之後的空間.
Next-Key Lock: 行鎖與間隙鎖組合起來用就叫做Next-Key Lock。鎖定一個範圍,並且鎖定記錄本身。對於行的查詢,都是採用該方法,主要目的是解決幻讀的問題。
建立表:(切記:是key(id),不是primary key(id))
([email protected]) [fandb]> create table t5(id int,key(id));
Query OK, 0 rows affected (0.02 sec)
SESSION_A>insert into t5 values(1),(4),(7),(10);
Query OK, 4 rows affected (0.00 sec)
Records: 4 Duplicates: 0 Warnings: 0
開始實驗:
SESSION_A>begin;
Query OK, 0 rows affected (0.00 sec)
SESSION_A>select * from t5;
+------+
| id |
+------+
| 1 |
| 4 |
| 7 |
| 10 |
+------+
4 rows in set (0.00 sec)
SESSION_A>select * from t5 where id=7 for update;
+------+
| id |
+------+
| 7 |
+------+
1 row in set (0.00 sec)
SESSION_B>begin;
Query OK, 0 rows affected (0.00 sec)
SESSION_B>insert into t5 values(2);
Query OK, 1 row affected (0.00 sec)
SESSION_B>insert into t5 values(12);
Query OK, 1 row affected (0.00 sec)
SESSION_B>insert into t5 values(5); --被阻塞
^CCtrl-C -- sending "KILL QUERY 93" to server ...
Ctrl-C -- query aborted.
^[[AERROR 1317 (70100): Query execution was interrupted
SESSION_B>insert into t5 values(7); --被阻塞
^CCtrl-C -- sending "KILL QUERY 93" to server ...
Ctrl-C -- query aborted.
ERROR 1317 (70100): Query execution was interrupted
SESSION_B>insert into t5 values(9); --被阻塞
^CCtrl-C -- sending "KILL QUERY 93" to server ...
Ctrl-C -- query aborted.
ERROR 1317 (70100): Query execution was interrupted
SESSION_B>commit;
Query OK, 0 rows affected (0.00 sec)
SESSION_A>select * from t5;
+------+
| id |
+------+
| 1 |
| 4 |
| 7 |
| 10 |
+------+
4 rows in set (0.00 sec)
SESSION_A>commit;
Query OK, 0 rows affected (0.00 sec)
SESSION_A>select * from t5;
+------+
| id |
+------+
| 1 |
| 2 |
| 4 |
| 7 |
| 10 |
| 12 |
+------+
6 rows in set (0.00 sec)
當以當前讀模式select * from t5 where id=7 for update;獲取 id=7的資料時,產生了 Next-Key Lock,鎖住了4-10範圍和 id=7單個record
從而阻塞了 SESSION_B在這個範圍內插入資料,而在除此之外的範圍內是可以插入資料的。
在倒數第二個查詢中,因為 read view 的存在,避免了我們看到 2和12兩條資料,避免了幻讀
同時因為 Next-Key Lock 的存在,阻塞了其他回話插入資料,因此當前模式讀不會產生幻讀(select for update 是以當前讀模式獲取資料)
儘量使用唯一索引,因為唯一索引會把Next-Key Lock降級為Record Lock
建立表(primary key)
([email protected]) [fandb]> create table t6(id int primary key);
Query OK, 0 rows affected (0.02 sec)
SESSION_A>insert into t6 values(1),(4),(7),(10);
Query OK, 4 rows affected (0.00 sec)
Records: 4 Duplicates: 0 Warnings: 0
開始實驗
SESSION_A>begin;
Query OK, 0 rows affected (0.00 sec)
SESSION_A>select * from t6;
+----+
| id |
+----+
| 1 |
| 4 |
| 7 |
| 10 |
+----+
4 rows in set (0.00 sec)
SESSION_A>select * from t6 where id=7 for update;
+----+
| id |
+----+
| 7 |
+----+
1 row in set (0.00 sec)
SESSION_B>begin;
Query OK, 0 rows affected (0.00 sec)
SESSION_B>insert into t6 values(5); --插入成功沒有阻塞
Query OK, 1 row affected (0.00 sec)
SESSION_B>insert into t6 values(8); --插入成功沒有阻塞
Query OK, 1 row affected (0.00 sec)
SESSION_B>commit;
Query OK, 0 rows affected (0.00 sec)
SESSION_A>select * from t6;
+----+
| id |
+----+
| 1 |
| 4 |
| 7 |
| 10 |
+----+
4 rows in set (0.00 sec)
SESSION_A>commit;
Query OK, 0 rows affected (0.00 sec)
SESSION_A>select * from t6;
+----+
| id |
+----+
| 1 |
| 4 |
| 5 |
| 7 |
| 8 |
| 10 |
+----+
6 rows in set (0.00 sec)
當 id 列有唯一索引,Next-Key Lock 會降級為 Records Lock
相關推薦
Mysql事務以及四中隔離級別例項2以及InnoDB如何解決當時讀的幻讀問題
第二種情況: 也就是基於上一種情況 事務A在事務B插入資料之前沒有進行select 沒有建立一個當前時間點的快照, 所以事務A ,在事務B 插入資料並提交後 再進行查詢操作就會出現幻讀 InnoDB通過Nextkey lock解決了當前讀時的
一文徹底讀懂MySQL事務的四大隔離級別
## 前言 之前分析一個死鎖問題,發現自己對資料庫隔離級別理解還不夠清楚,所以趁著這幾天假期,整理一下MySQL事務的四大隔離級別相關知識,希望對大家有幫助~ ![](https://user-gold-cdn.xitu.io/2020/4/5/171498a008c91b4c?w=985&h=6
MYSQL資料庫事務4種隔離級別及7種傳播行為
事務的特性: 原子性:事務的不可分割,組成事務的各個邏輯單元不可分割。 一致性:事務執行的前後,資料完整性保持一致。 隔離性:事務執行不應該受到其他事務的干擾。 永續性:事務一旦結束,資料就持久化到資料庫中。 檢視/設定隔離級別 檢視:SELECT @@tx
撩課-Mysql第16部分-事務併發/髒讀/幻讀/與隔離級別
學習地址: 撩課-JavaWeb系列1之基礎語法-前端基礎 撩課-JavaWeb系列2之XML 撩課-JavaWeb系列3之MySQL 撩課-JavaWeb系列4之JDBC 撩課-JavaWeb系列5之web伺服器-idea 事務的併發問題 1.髒讀 老闆要給程式設
事務的四個特徵和MySQL的四種隔離級別
來源:https://www.jb51.net/article/96179.htm 一、首先什麼是事務? 事務是應用程式中一系列嚴密的操作,所有操作必須成功完成,否則在每個操作中所作的所有更改都會被撤消。也就是事務具有原子性,一個事務中的一系列的操作要麼全部成功,要麼一個都不做。 事
資料庫事務的四大特性以及事務的隔離級別-與-Spring事務傳播機制&隔離級別
本篇講訴資料庫中事務的四大特性(ACID),並且將會詳細地說明事務的隔離級別。 如果一個數據庫聲稱支援事務的操作,那麼該資料庫必須要具備以下四個特性: ⑴ 原子性(Atomicity) 原子性是指事務包含的所有操作要麼全部成功,要麼全部失敗回滾,這和前面兩篇部落格介紹事務的功能是一樣的概念,因此
事務。事務特性。隔離級別。傳播特性。以及spring怎麼處理事務
1.什麼是事務:事務是程式中一系列嚴密的操作,所有操作執行必須成功完成,否則在每個操作所做的更改將會被撤銷,這也是事務的原子性(要麼成功,要麼失敗)。2.事務特性:事務特性分為四個:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、
資料庫事務隔離級別例項探討
我們知道,資料一般有如下四種隔離級別 0. read uncommitted (讀未提交)1. read committed (讀已提交)2. repeatabale read (可重複讀)3. serializable read (序列化讀) 下面通過例項介紹這
理解資料庫事務隔離級別以及髒讀, 不可重複讀, 幻讀
資料庫事務的4個特性: 原子性(atomic): 都成功或者都失敗;一致性(consistency):事務操作之後,資料庫所處的狀態和業務規則是一致的;比如a,b賬戶相互轉賬之後,總金額不變;隔離性(isolation):操作中的事務不相互影響;永續性(durability
深入解析Mysql中事務的四大隔離級別及其所解決的讀現象
本文詳細介紹四種事務隔離級別,並通過舉例的方式說明不同的級別能解決什麼樣的讀現象。並且介紹了在關係型資料庫中不同的隔離級別的實現原理。 在DBMS中,事務保證了一個操作序列可以全部都執行或者全部都不執行(原子性),從一個狀態轉變到另外一個狀態(一致性)。由於事務滿足久性。所以一旦事務被提交之後,資料就能夠
轉載:數據庫事務四種隔離級別
log 有效 取數 控制 get 同一行 幻讀 url phantom 原帖:http://blog.csdn.net/tolcf/article/details/49283575 定義:在數據庫操作中,為了有效保證並發讀取數據的正確性,提出的事務隔離級別。 數據庫事務的隔
數據庫事務特性和隔離級別
read 事務隔離 mil 對數 alt tro 取數 部分 失敗 事務 一組業務操作,要麽全部成功,要麽全部不成功。 ----------------事務的特性-------------- 原子性:一個事務是一個整體,不可分割,事務中的操作要麽都成功,要麽都失敗。
數據庫 之 事務控制和隔離級別
可能 處理 eas 獨立 ble space 銷毀 實現 rac 1 概述事務是指一組原子性的SQL查詢、或者是一個或多個SQL語句組成的獨立工作單元;MyISAM不流行的原因很大是因為其不支持事務的處理功能。2 事務日誌事務日誌定義屬性,有些參數可以運行時修改,寫入在
Mysql中事物及隔離級別
事務隔離界別 Mysql ACID 什麽叫事務 事務就是一組sql組成的操作單元,要麽操作全部成功,要麽全部失敗。 ACID屬性 原子性(atomicity) 一個事物必須被視為一個不可分割的最小工作單元,整個事務要麽全部成功,要麽全部失敗回滾,對一個事物來說,不可能只執行其中的一部分操作。 一致
數據庫事務4種隔離級別和7種傳播行為
事物 程序 單位 oracle 異常 邏輯 封裝 supported dbms 隔離級別越高,越能保證數據的完整性和一致性,但是對並發性能的影響也越大。對於多數應用程序,可以優先考慮把數據庫系統的隔離級別設為Read Committed。它能夠避免臟讀取,而且具有較
數據庫事務中的隔離級別和鎖+spring Transactional註解
遇到 丟失更新 讀鎖 討論 acid 通過 行修改 nal dbms 數據庫事務中的隔離級別和鎖 數據庫事務在後端開發中占非常重要的地位,如何確保數據讀取的正確性、安全性也是我們需要研究的問題。 ACID 首先總結一下數據庫事務正確執行的四個要素(ACID): 原子性(At
spring管理事務屬性之事務4種隔離級別 理解事務的4種隔離級別
理解事務的4種隔離級別 資料庫事務的隔離級別有4種,由低到高分別為Read uncommitted 、Read committed 、Repeatable read 、Serializable 。而且,在事務的併發操作中可能會出現髒讀,不可重複讀,幻讀。下面通過事例一一闡述
檢視和修改MySQL資料庫的事物隔離級別
檢視mysql的事務隔離級別 mysql> show variables like '%isolation%'; +---------------+-----------------+ | Variable_name | Value | +---------
13-SpringBoot之資料庫(四)——事務處理:隔離級別與傳播行為
SpringBoot之資料庫(四)——事務處理:隔離級別與傳播行為 1. 隔離級別(isolation) 1.1 未提交讀 1.2 讀寫提交 1.3 可重複讀 1.4 序列化 1.5 使用合理的隔離級別
髒讀、幻讀、不可重複讀 and 樂觀鎖、悲觀鎖 and 事務五種隔離級別
一、髒讀、不可重複讀、幻讀 1、髒讀:髒讀就是指當一個事務正在訪問資料,並且對資料進行了修改,而這種修改還沒有提交到資料庫中,這時,另外一個事務也訪問這個資料,然後使用了這個資料。 例如: 張三的工資為5000,事務A中把他的工資改為8000,但事務A尚未提