事務沒提交的數據查的出來嗎?_“金三銀四”面試官:說說事務的ACID,什么是臟讀、幻讀?...

c49deb5699b2048f05ef57e251193532.png

一、事務

事務是數據庫管理系統執行過程中的一個邏輯單位,由一個有限的數據庫操作序列構成。--摘自百科

在MySQL里,事務是在引擎層面實現,比如MyIsam不支持,InnoDB支持

面試清單(Java崗):Java+JVM+數據庫+算法+Spring+中間件+設計模式?shimo.im
c3d746e638be93ea2d0460f5b0178772.png

二、ACID

提到事務,肯定會想到 ACID 是吧,自行感受一下概念,然后我們來講講隔離性的問題。

  • 原子性:事務的所有操作要么全部成功,要么全部回滾。

75cfc05adbe308eac37e491500c67920.png
  • 一致性:總是從一個一致性的狀態轉換到另一個一致性的狀態。
  • 隔離性:多個事務并發執行時,一個事務的執行不應影響其他事務的執行

17571819ecdcec3198a1ba9abeeeff3e.png
  • 持久性:已被提交的事務對數據庫的修改應該永久保存在數據庫中。

三、隔離級別

做了多年的 CRUDer,對這幾個詞真是不陌生,要不是出去面試,也真不會去了解。希望大家看完之后,面試的時候,不要慌,跟他剛。

實際上,這些場景都是出現在多個事務同時執行時的場景。

3.1 臟讀(Read Uncommitted)

通俗的講,一個事務在處理過程中讀取了另外一個事務未提交的數據。

你都還沒提交,我就讀到了你剛操作的數據,萬一你回滾了怎么辦,你說這臟不臟。

舉例:

c668d66f0d69b14015abb9c431fb6e1c.png

假設打賞的邏輯是:① 我的賬戶+1元;② 你的賬戶-1元。

當你執行到第一個步驟,我去查詢我的賬戶已經是2元了,很開心!!!宣布請大家去擼串!!!但是最后扣款的時候發現你余額不足了,回滾了,我的1元沒了,就很難受!!

3.2 不可重復讀(Non-repeatable Read)

通俗的講,一個事務范圍內,多次查詢某個數據,卻得到不同的結果。

與臟讀的區別:臟讀是讀到未提交的數據,而不可重復讀讀到的卻是已經提交的數據,但實際上是違反了事務的一致性原則。

舉例:

f03e1dbf6ce66ac80cad60c9b43af015.png

假設我查了下賬戶余額,看到你們給小編打賞了1塊錢,很開心!!!宣布請大家去擼串!!!在付款之前,錢被另外一個人取走,又查詢到沒錢了,被留下來洗碗了!!!

因為我查詢完后,這條數據沒鎖住,又被別的事務更新了,導致當前事務每次都是讀到最新的數據。

3.3 幻讀

在Repeatable Read隔離級別下,一個事務可能會遇到幻讀(Phantom Read)的問題。

事務A讀取與搜索條件相匹配的若干行。事務B以插入或刪除行等方式來修改事務A的結果集,然后再提交。

舉例:

eafda264720e7758b20025838f5f606f.png

看到了嗎,在一個事務A中,第一次查詢某條記錄,是沒有的,但是,當試圖更新這條不存在的記錄時,竟然能成功,并且,再次讀取同一條記錄,它就神奇地出現了。

實際上,在InnoDB引擎中,對于索引的掃描,不僅鎖住掃描到的索引,而且還鎖住這些索引覆蓋的范圍(gap),因此這個范圍是內插入數據是不允許的。

四、mysql模擬事務隔離性測試

SELECT @@session.tx_isolation;   
SELECT @@tx_isolation;  SET SESSION TRANSACTION ISOLATION LEVEL read uncommitted;  
SET SESSION TRANSACTION ISOLATION LEVEL read committed;  
SET SESSION TRANSACTION ISOLATION LEVEL repeatable read;  
SET SESSION TRANSACTION ISOLATION LEVEL serializable;  start transaction;--建表
drop table AMOUNT;
CREATE TABLE `AMOUNT` (
`id`  varchar(10) NULL,
`money`  numeric NULL
)
;
--插入數據
insert into amount(id,money) values('A', 800);
insert into amount(id,money) values('B', 200);
insert into amount(id,money) values('C', 1000);
--測試可重復讀,插入數據
insert into amount(id,money) values('D', 1000);--設置事務
SET SESSION TRANSACTION ISOLATION LEVEL read uncommitted;  
SELECT @@tx_isolation;  
--開啟事務
start transaction;--臟讀演示,讀到其他事務未提交的數據
--案列1,事務一:A向B轉200,事務二:查看B金額變化,事務一回滾事務
update amount set money = money - 200 where id = 'A';
update amount set money = money + 200 where id = 'B';--不可重復讀演示,讀到了其他事務提交的數據
--案列2,事務一:B向A轉200,事務二:B向C轉200轉100
SET SESSION TRANSACTION ISOLATION LEVEL read committed;  --開啟事務
start transaction;
--兩個事務都查一下數據(轉賬之前需要,查一下金額是否夠滿足轉賬)
select * from amount;
--事務一:B向A轉200
update amount set money = money - 200 where id = 'B';
update amount set money = money + 200 where id = 'A';commit;
--事務二:B向C轉200轉100
update amount set money = money - 100 where id = 'B';
update amount set money = money + 100 where id = 'C';
commit;
--從事務二的角度來看,讀到了事務一提交事務的數據,導致金額出現負數--幻讀演示
--案列3,事務一:B向A轉200,事務二:B向C轉200轉100
SET SESSION TRANSACTION ISOLATION LEVEL repeatable read;  --開啟事務
start transaction;
--兩個事務都查一下數據(轉賬之前需要,查一下金額是否夠滿足轉賬)
select * from amount;
--事務一:B向A轉200
update amount set money = money - 200 where id = 'B';
update amount set money = money + 200 where id = 'A';commit;
--事務二:B向C轉200轉100
update amount set money = money - 100 where id = 'B';
update amount set money = money + 100 where id = 'C';
commit;
--從事務二的角度來看,讀到了事務一提交事務的數據,導致金額出現負數
作者:Java2B
原文鏈接:https://juejin.im/post/5e1417006fb9a047f3363c41

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

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

相關文章

Linux加密框架 crypto 算法模板

參考鏈接 Linux加密框架中的主要數據結構(三)_家有一希的博客-CSDN博客algapi.h - include/crypto/algapi.h - Linux source code (v5.15.11) - Bootlin 定義 struct crypto_template {struct list_head list;struct hlist_head instances;struct modu…

python找最長的字符串_為Python找到最長重復字符串的有效方法(從Pearls編程)

我的解決方案是基于后綴數組。它是由最長公共前綴的兩倍前綴構成的。最壞情況下的復雜度是O(n(logn)^2)。任務”伊利亞特.mb.txt“在我的筆記本上花了4秒鐘。代碼在函數suffix_array和longest_common_substring中有很好的文檔記錄。后一個函數很短,可以很容易地修改…

Linux加密框架 crypto 算法模板 CBC模板舉例

參考鏈接 Linux加密框架中的主要數據結構(三)_家有一希的博客-CSDN博客https://blog.csdn.net/CHYabc123456hh/article/details/122194754 CBC算法模板 cbc.c - crypto/cbc.c - Linux source code (v5.15.11) - BootlinCBC算法模板屬性 1)CBC算法模板名…

leetcode數組匯總_LeetCode刷題實戰43:字符串相乘

算法的重要性,我就不多說了吧,想去大廠,就必須要經過基礎知識和業務邏輯面試算法面試。所以,為了提高大家的算法能力,這個公眾號后續每天帶大家做一道算法題,題目就從LeetCode上面選 !今天和大家…

Linux加密框架 crypto 算法模板 HMAC模板舉例

參考鏈接 Linux加密框架中的主要數據結構(三)_家有一希的博客-CSDN博客Linux加密框架 crypto 算法模板_CHYabc123456hh的博客-CSDN博客 HMAC算法模板 hmac.c - crypto/hmac.c - Linux source code (v5.15.11) - Bootlinhmac.c - crypto/hmac.c - Linux…

判斷非負整數是否是3的倍數_五年級數學因數與倍數知識點匯總與解題方法技巧...

在日常教學過程中,我發現孩子們和某些家長對學習數學的方法有一些誤區,就是覺著數學,單純就是邏輯思維,只要多做練習題就能學好,但是不是這樣的,低年級的學生,學習數學還是以背誦為主&#xff0…

tcp通訊一次最多能發送多少數據?_關于TCP/IP,必須知道的十個知識點

本文整理了一些TCP/IP協議簇中需要必知必會的十大問題,既是面試高頻問題,又是程序員必備基礎素養。一、TCP/IP模型TCP/IP協議模型(Transmission Control Protocol/Internet Protocol),包含了一系列構成互聯網基礎的網絡…

Linux內核crypto子系統的調用邏輯

testmgr.c - crypto/testmgr.c - Linux source code (v5.15.11) - Bootlin上述代碼是內核內部即crypto子系統對外提供密碼服務的測試程序調用流程&#xff1a;crypto API <—> crypto core <—> crypto_register_alg處于用戶態的程序想要調用處于內核態的密碼算法&…

python成語填空_python定期循環成語?

我有一個工作單位我希望每N秒發生一次.如果我使用簡單化minute 60while True:doSomeWork()time.sleep(minute)取決于doSomeWork()花費的時間,實際循環周期將是一分鐘加上那個時間.如果doSomeWork()所花費的時間不是確定性的,則工作周期更加難以預測.我想做的就是這樣minute 6…

Linux加密框架 crypto算法模板 以及CBC算法模板實例

參考鏈接 Linux加密框架中的主要數據結構&#xff08;四&#xff09;_家有一希的博客-CSDN博客algapi.h - include/crypto/algapi.h - Linux source code (v5.15.11) - Bootlin struct crypto_instance {struct crypto_alg alg;struct crypto_template *tmpl;union {/* Node i…

tomcat temp 大量 upload 文件_滲透測試之文件上傳漏洞總結

文末下載上傳環境源碼客戶端js檢查一般都是在網頁上寫一段javascript腳本&#xff0c;校驗上傳文件的后綴名&#xff0c;有白名單形式也有黑名單形式。查看源代碼可以看到有如下代碼對上傳文件類型進行了限制&#xff1a;我們可以看到對上傳文件類型進行了限制。繞過方法1.我們…

Linux加密框架 crypto算法模板 以及HMAC算法模板實例

HMAC算法模板實例 HMAC算法模板的創建實例的接口是hmac_create函數hmac.c - crypto/hmac.c - Linux source code (v5.15.11) - Bootlin hmac_create輸入的參數包括 算法模板 tmpl 和 算法模板實例參數 tbhmac_cretae函數返回的結果為0表示算法模板實例已經創建注冊算法模…

python判斷密碼強度并輸出_密碼強度判斷

[python]代碼庫def pdsz(cd):nnnn Falsefor c in cd:if c.isnumeric():nnnn Truebreakreturn nnnndef pdzm(cd):nnnn Falsefor c in cd:if c.isupper():nnnn Truebreakreturn nnnndef pdhh(cd):nnnn Falsefor c in cd:if c.islower():nnnn Truebreakreturn nnnndef main(…

linux加密框架 crypto 算法crypto_register_alg的注冊流程

算法注冊流程 靜態算法模塊初始化 分組算法模塊初始化 AES算法模塊&#xff08;aes_generic.c&#xff09;的初始化接口aes_init實現向加密框架注冊AES算法的功能&#xff0c;如下所示。aes_generic.c - crypto/aes_generic.c - Linux source code (v5.15.12) - Bootlin sta…

python 方法的實例_python調用自定義函數的實例操作

在python中&#xff0c;想要調用自定義函數必須先聲明&#xff0c;然后才能調用。使用函數時&#xff0c;只要按照函數定義的形式&#xff0c;向函數傳遞必需的參數&#xff0c;就可以調用函數完成相應的功能或者獲得函數返回的處理結果。(1)聲明函數python中使用 def 可以聲明…

linux加密框架 crypto 靜態哈希算法crypto_register_shash注冊流程

參考鏈接 Linux加密框架的算法管理&#xff08;一&#xff09;_家有一希的博客-CSDN博客_linux加密框架設計與實現shash.c - crypto/shash.c - Linux source code (v5.15.12) - Bootlin 函數介紹 crypto_register_shash函數實現向加密框架注冊靜態哈希算法的功能&#xff0c;…

多個線程訪問統一對象的不同方法_C#多線程讀寫同一文件處理

在多線程訪問讀寫同一個文件時&#xff0c;經常遇到異常&#xff1a;“文件正在由另一進程使用&#xff0c;因此該進程無法訪問此文件”。多線程訪問統一資源的異常&#xff0c;解決方案1&#xff0c;保證讀寫操作單線程執行&#xff0c;可以使用lock解決方案2&#xff0c;使用…

linux加密框架 crypto 通用算法注冊接口__crypto_register_alg注冊流程

函數介紹 __crypto_register_alg函數實現向加密框架注冊算法&#xff08;包括靜態算法和動態算法&#xff09;的功能&#xff0c;輸入參數為算法說明alg&#xff0c;注冊成功時返回算法注冊用的算法幼蟲larval&#xff0c;注冊失敗時返回失敗原因。__crypto_register_alg函數執…

spark官方文檔_Spark整合Ray思路漫談

什么是Ray之前花了大概兩到三天把Ray相關的論文&#xff0c;官網文檔看了一遍&#xff0c;同時特意去找了一些中文資料看Ray當前在國內的發展情況(以及目前國內大部分人對Ray的認知程度)。先來簡單介紹下我對Ray的認知。首先基因很重要&#xff0c;所以我們先需要探查下Ray最初…

python用http協議傳數據_python基礎 -- 簡單實現HTTP協議

標簽&#xff1a;一、直接代碼# -*- coding: utf-8 -*-import socket__author__ ‘lpe234‘__date__ ‘2015-03-12‘if __name__ ‘__main__‘:sock socket.socket(socket.AF_INET, socket.SOCK_STREAM)sock.bind((‘127.0.0.1‘, 8001))sock.listen(5)while True:connecti…