1. 程式人生 > >Mysql事務以及四中隔離級別例項2以及InnoDB如何解決當時讀的幻讀問題

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尚未提