事務隔離級別動圖演示

事務的基本要素(ACID)

原子性(Atomicity)

  • 事務開始后所有操作,要么全部做完,要么全部不做,不可能停滯在中間環節。事務執行過程中出錯,會回滾到事務開始前的狀態,所有的操作就像沒有發生一樣。也就是說事務是一個不可分割的整體,就像化學中學過的原子,是物質構成的基本單位。

一致性(Consistency)

  • 事務開始前和結束后,數據庫的完整性約束沒有被破壞 。比如A向B轉賬,不可能A扣了錢,B卻沒收到。

隔離性(Isolation)

  • 同一時間,只允許一個事務請求同一數據,不同的事務之間彼此沒有任何干擾。比如A正在從一張銀行卡中取錢,在A取錢的過程結束前,B不能向這張卡轉賬。

持久性(Durability)

  • 事務完成后,事務對數據庫的所有更新將被保存到數據庫,不能回滾。

事務的并發

臟讀

  • 事務A讀取了事務B更新的數據,然后B回滾操作,那么A讀取到的數據是臟數據

不可重復讀

  • 事務 A 多次讀取同一數據,事務 B 在事務A多次讀取的過程中,對數據作了更新并提交,導致事務A多次讀取同一數據時,結果 不一致。

幻讀

  • 系統管理員A將數據庫中所有學生的成績從具體分數改為ABCDE等級,但是系統管理員B就在這個時候插入了一條具體分數的記錄,當系統管理員A改結束后發現還有一條記錄沒有改過來,就好像發生了幻覺一樣,這就叫幻讀。

小結:不可重復讀的和幻讀很容易混淆,不可重復讀側重于修改,幻讀側重于新增或刪除。解決不可重復讀的問題只需鎖住滿足條件的行,解決幻讀需要鎖表

MySQL事務隔離級別

事務隔離級別臟讀不可重復讀幻讀
讀未提交(read-uncommitted)
讀已提交(read-committed)
可重復讀(repeatable-read)
串行化(serializable)
  • MySQL是可重復讀
  • MyISAM是不可重復讀

隔離級別

查看當前隔離級別

mysql> select @@tx_isolation;
+-----------------+
| @@tx_isolation  |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set, 1 warning (0.00 sec)

更改隔離級別

mysql> set session transaction isolation level read uncommitted;
Query OK, 0 rows affected (0.00 sec)mysql> select @@tx_isolation;
+------------------+
| @@tx_isolation   |
+------------------+
| READ-UNCOMMITTED |
+------------------+
1 row in set, 1 warning (0.00 sec)

讀未提交(read-uncommitted)測試

  1. 修改兩個客戶端的隔離級別
  2. (kou)1開始事務,把3改成2
  3. 這個時候kou1還沒有commit,但是kou查出了他正在修改的數據
  4. 如果kou1這個時候rollback,那么kou查到的就是錯誤的數據

不可重復讀(read-committed)

  • kou1和kou開啟事務
  • kou1進行了讀取,這是kou修改并提交了事務。這時kou1在讀取(kou1正在事務中,且沒提交)事務,就讀到了新的數據,在一個事務內讀取到了兩個結果,。產生了不可重復讀現象。

它的級別高于讀未提交

  • 解決了臟讀問題
    在這里插入圖片描述
  • kou1的事務還沒結束,但是kou提交了,kou1就查到了兩個不同的數據
    在這里插入圖片描述

可重復讀

  • kou事務
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)mysql> select * from book;
+----+-----------+-----------+
| id | name      | author    |
+----+-----------+-----------+
|  1 | 紅樓夢    | 曹雪芹    |
|  2 | 2         | 2         |
|  3 | 3         | 3         |
+----+-----------+-----------+
3 rows in set (0.00 sec)mysql> insert into book values(4,4,4);
Query OK, 1 row affected (0.00 sec)mysql> commit;
Query OK, 0 rows affected (0.01 sec)
  • kou1事務
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)mysql> select * from book;
+----+-----------+-----------+
| id | name      | author    |
+----+-----------+-----------+
|  1 | 紅樓夢    | 曹雪芹    |
|  2 | 2         | 2         |
|  3 | 3         | 3         |
+----+-----------+-----------+
3 rows in set (0.00 sec)mysql> insert into book values(4,4,4);
ERROR 1062 (23000): Duplicate entry '4' for key 'PRIMARY'
mysql> select * from book;
+----+-----------+-----------+
| id | name      | author    |
+----+-----------+-----------+
|  1 | 紅樓夢    | 曹雪芹    |
|  2 | 2         | 2         |
|  3 | 3         | 3         |
+----+-----------+-----------+
3 rows in set (0.00 sec)
  • 這個時候插入4,不能插入,可是顯示卻什么也顯示不出來。這就是幻讀

  • 如果想讀取新增數據的信息,并沒有讀取到新增的那條,如果想要讀取到新增的數據信息,可以在查詢語句后面加 for update , 這樣可以查到最新數據版本號的記錄,或者執行commit操作。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/382358.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/382358.shtml
英文地址,請注明出處:http://en.pswp.cn/news/382358.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C/C++的優點和缺點

1.C/C語言的優點 C語言是面向過程的語言,常用來編寫操作系統。C語言是從C語言發展過來的,是一門面向對象的語言,它繼承了C語言的優勢,同時也添加了三個主要的內容:Oriented-Object class,Template,STL. 1)C/C可以潛入…

C/C++命令行參數那點事

int main(int argc, char *argv[ ]); 1.命令行參數:在命令行中給定的參數; 2.命令行參數在對函數main的調用時,主要有兩個參數送到main,一個是argc(argument count),命令行參數的個數,另外一個是argv,命令行參數的數組,命令行參…

mysql row_id為什么是6字節?為什么是8字節

mysql row_id是幾個字節? row_id InnoDB表中在沒有默認主鍵的情況下會生成一個6字節空間的自動增長主鍵 row_id是整型還是字符型? 源代碼中 row_id 是 ib_uint64_t 這是 8字節 uint64_t 是整形 為什么是6個字節? P.S. Base64編碼說明 B…

linux中的man文檔結構

使用命令 man chapter章節號查找的內容

偽隨機數和真隨機數

偽隨機數小項目 猜數字游戲 //C語言 猜數字游戲 https://blog.csdn.net/csdn_kou/article/details/79785709 C語言之隨機數生成超詳解 https://blog.csdn.net/csdn_kou/article/details/79788815 在上面的文章中,使用固定函數就一直是生成固定的隨機結果&#…

linux中的IO函數

1)open函數:以特定的方式打開一個文件; 頭文件:sys/type.h sys/stat.h fcntl.h 返回值:錯誤則返回-1,正確則返回文件描述符(int類型,范圍為3~1023,文件的標號) 函數原型&#xff…

ps -ef和ps aux

ps -ef和ps aux ps -ef unix風格 -e 列出所有進程 -f 完整格式 UID PID PPID C STIME TTY TIME CMD root 1 0 0 8月27 ? 00:25:08 /usr/lib/systemd/systemd --switched-root --system --deserialize 22 root 2 0 0 8月…

Linux中screen的用法

screen 查看當前有多少窗口 [rootpython ~]# screen -ls There are screens on:20706.khz (Attached)20679.khz (Attached)20453.khz (Attached)20143.khz (Detached)16993.pts-2.python (Attached) 5 Sockets in /var/run/screen/S-root.新建一…

linux文件操作相關函數

(1)stat函數:顯示文件的相關信息(類似于 ls -l的感覺) 頭文件及函數原型: 函數參數:path:文件的路徑,buf是指待寫入的文件信息,fd:表示文件描述符; stat,fstat,lstat三者…

linux查看硬盤是不是ssd固態硬盤

linux查看硬盤是不是ssd固態硬盤 sdb是ssd、sr0是SATA [root 01 ~]# cat /sys/block/sdb/queue/rotational 0 [root 01 ~]# cat /sys/block/sr0/queue/rotational 1

linux目錄操作函數

(1)chdir函數:修改當前進程的路徑 函數頭文件及原型: 參數:要修改的文件路徑或文件描述符(一般是當前空閑最小的) 返回值:成功(0),失敗&#xff0…

linux中的dup和fcntl的用法

(1)dup函數:文件描述符的拷貝 函數頭文件及函數原型: 參數:原來的文件描述符,新的文件描述符,標志位; 返回值:成功(返回新的文件描述符)失敗&…

^M

為什么打開文件有^M 計算機還沒有出現之前,有一種叫做電傳打字機(Teletype Model 33)的玩意,每秒鐘可以打10個字符。但是它有一個問題,就是打完一行換行的時候,要用去0.2秒,正好可以打兩個字符…

使用dup2實現重定向到屏幕終端遇到問題

參考博客:https://blog.csdn.net/qq_26093511/article/details/53255970 參考博客:https://blog.csdn.net/db199410/article/details/52335450#commentBox 1.要解決的問題 通過復制文件描述符來實現文件重定向問題。 2.實現代碼 2.代碼輸出 按照原來的…

redis源碼剖析(十二)—— RDB持久化

文章目錄RBD文件載入RDB文件分析源碼分析核心代碼rdb文件寫入rdb寫入關鍵函數rdbSaveObjectTyperdbSaveStringObjectRawrdbSaveLongLongAsStringObject為避免數據丟失。將redis中的數據保存到磁盤中,避免數據意外丟失。 RBD文件載入 在redis啟動時檢測是否有rdb文件…

linux操作系統之exec函數族

當我們想在進程中執行另外一個函數或程序時,可以使用exec函數。進程調用exec函數,則該進程中用戶空間所有代碼和數據會完全被新程序替換,但是不會創建新進程,因此進程id不會發生改變。 函數族的頭文件:unistd.h l:li…

redis源碼剖析(十三)—— dump.rdb文件分析

文章目錄操作方式查看rdb文件參考文檔redis作者解釋rdb和aof的不同redisRDB文件格式Sripathi Krishnamredis各個版本變化操作方式 127.0.0.1:9999> flushall OK 127.0.0.1:9999> set name hodge OK 127.0.0.1:9999> save OK查看rdb文件 [rootpython src]# od -c dum…

linux操作系統之子進程回收函數wait和waitpid函數小結

一個進程在終止時會關閉所有的文件描述符,釋放用戶空間分配的內存,但是它的PCB還保留著,內核在其中還保留著進程的一些信息:如果正常終止,則保留著退出狀態;如果異常終止則保存著導致進程種植的信號。 在父…

一鍵登錄云阿里云

免密登錄堡壘機 安裝oathtool和sshpass 這兩個文件安裝比較耗費時間! brew install oath-toolkit brew install https://raw.githubusercontent.com/kadwanev/bigboybrew/master/Library/Formula/sshpass.rb阿里云item2一鍵連接 1 #!/bin/bash23 sshpass -p 密碼…

linux操作系統進程間通信IPC之管道pipe及FIFO

linux環境下,各進程相互獨立,如果想要交換兩個進程之間的數據,需要通過內核,在內存中提供一個緩存區,一個進程往緩存區中寫數據,一個往緩存區讀數據,內核提供的這種機制稱為進程間通信(IPC&…