主頁 > 資料庫 > 一文講清楚MySQL事務隔離級別和實作原理,開發人員必備知識點

一文講清楚MySQL事務隔離級別和實作原理,開發人員必備知識點

2020-09-17 15:44:33 資料庫

經常提到資料庫的事務,那你知道資料庫還有事務隔離的說法嗎,事務隔離還有隔離級別,那什么是事務隔離,隔離級別又是什么呢?本文就幫大家梳理一下,

MySQL 事務

本文所說的 MySQL 事務都是指在 InnoDB 引擎下,MyISAM 引擎是不支持事務的,

資料庫事務指的是一組資料操作,事務內的操作要么就是全部成功,要么就是全部失敗,什么都不做,其實不是沒做,是可能做了一部分但是只要有一步失敗,就要回滾所有操作,有點一不做二不休的意思,

假設一個網購付款的操作,用戶付款后要涉及到訂單狀態更新、扣庫存以及其他一系列動作,這就是一個事務,如果一切正常那就相安無事,一旦中間有某個環節例外,那整個事務就要回滾,總不能更新了訂單狀態但是不扣庫存吧,這問題就大了,

事務具有原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)四個特性,簡稱 ACID,缺一不可,今天要說的就是隔離性

概念說明

以下幾個概念是事務隔離級別要實際解決的問題,所以需要搞清楚都是什么意思,

臟讀

臟讀指的是讀到了其他事務未提交的資料,未提交意味著這些資料可能會回滾,也就是可能最終不會存到資料庫中,也就是不存在的資料,讀到了并一定最終存在的資料,這就是臟讀,

可重復讀

可重復讀指的是在一個事務內,最開始讀到的資料和事務結束前的任意時刻讀到的同一批資料都是一致的,通常針對資料更新(UPDATE)操作,

不可重復讀

對比可重復讀,不可重復讀指的是在同一事務內,不同的時刻讀到的同一批資料可能是不一樣的,可能會受到其他事務的影響,比如其他事務改了這批資料并提交了,通常針對資料更新(UPDATE)操作,

幻讀

幻讀是針對資料插入(INSERT)操作來說的,假設事務A對某些行的內容作了更改,但是還未提交,此時事務B插入了與事務A更改前的記錄相同的記錄行,并且在事務A提交之前先提交了,而這時,在事務A中查詢,會發現好像剛剛的更改對于某些資料未起作用,但其實是事務B剛插入進來的,讓用戶感覺很魔幻,感覺出現了幻覺,這就叫幻讀,

事務隔離級別

SQL 標準定義了四種隔離級別,MySQL 全都支持,這四種隔離級別分別是:

  1. 讀未提交(READ UNCOMMITTED)

  2. 讀提交 (READ COMMITTED)

  3. 可重復讀 (REPEATABLE READ)

  4. 串行化 (SERIALIZABLE)

從上往下,隔離強度逐漸增強,性能逐漸變差,采用哪種隔離級別要根據系統需求權衡決定,其中,可重復讀是 MySQL 的默認級別,

事務隔離其實就是為了解決上面提到的臟讀、不可重復讀、幻讀這幾個問題,下面展示了 4 種隔離級別對這三個問題的解決程度,

隔離級別 臟讀 不可重復讀 幻讀
讀未提交 可能 可能 可能
讀提交 不可能 可能 可能
可重復讀 不可能 不可能 可能
串行化 不可能 不可能 不可能

只有串行化的隔離級別解決了全部這 3 個問題,其他的 3 個隔離級別都有缺陷,

一探究竟

下面,我們來一一分析這 4 種隔離級別到底是怎么個意思,

如何設定隔離級別

我們可以通過以下陳述句查看當前資料庫的隔離級別,通過下面陳述句可以看出我使用的 MySQL 的隔離級別是 REPEATABLE-READ,也就是可重復讀,這也是 MySQL 的默認級別,

# 查看事務隔離級別 5.7.20 之后
show variables like 'transaction_isolation';
SELECT @@transaction_isolation

# 5.7.20 之后
SELECT @@tx_isolation
show variables like 'tx_isolation'

+---------------+-----------------+
| Variable_name | Value           |
+---------------+-----------------+
| tx_isolation  | REPEATABLE-READ |
+---------------+-----------------+

稍后,我們要修改資料庫的隔離級別,所以先了解一下具體的修改方式,

修改隔離級別的陳述句是:set [作用域] transaction isolation level [事務隔離級別],
SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE},

其中作用于可以是 SESSION 或者 GLOBAL,GLOBAL 是全域的,而 SESSION 只針對當前回話視窗,隔離級別是 {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE} 這四種,不區分大小寫,

比如下面這個陳述句的意思是設定全域隔離級別為讀提交級別,

mysql> set global transaction isolation level read committed; 

MySQL 中執行事務

事務的執行程序如下,以 begin 或者 start transaction 開始,然后執行一系列操作,最后要執行 commit 操作,事務才算結束,當然,如果進行回滾操作(rollback),事務也會結束,

需要注意的是,begin 命令并不代表事務的開始,事務開始于 begin 命令之后的第一條陳述句執行的時候,例如下面示例中,select * from xxx 才是事務的開始,

begin;
select * from xxx; 
commit; -- 或者 rollback;

另外,通過以下陳述句可以查詢當前有多少事務正在運行,

select * from information_schema.innodb_trx;

好了,重點來了,開始分析這幾個隔離級別了,

接下來我會用一張表來做一下驗證,表結構簡單如下:

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(30) DEFAULT NULL,
  `age` tinyint(4) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8

初始只有一條記錄:

mysql> SELECT * FROM user;
+----+-----------------+------+
| id | name            | age  |
+----+-----------------+------+
|  1 | 古時的風箏        |    1 |
+----+-----------------+------+

讀未提交

MySQL 事務隔離其實是依靠鎖來實作的,加鎖自然會帶來性能的損失,而讀未提交隔離級別是不加鎖的,所以它的性能是最好的,沒有加鎖、解鎖帶來的性能開銷,但有利就有弊,這基本上就相當于裸奔啊,所以它連臟讀的問題都沒辦法解決,

任何事務對資料的修改都會第一時間暴露給其他事務,即使事務還沒有提交,

下面來做個簡單實驗驗證一下,首先設定全域隔離級別為讀未提交,

set global transaction isolation level read uncommitted;

設定完成后,只對之后新起的 session 才起作用,對已經啟動 session 無效,如果用 shell 客戶端那就要重新連接 MySQL,如果用 Navicat 那就要創建新的查詢視窗,

啟動兩個事務,分別為事務A和事務B,在事務A中使用 update 陳述句,修改 age 的值為10,初始是1 ,在執行完 update 陳述句之后,在事務B中查詢 user 表,會看到 age 的值已經是 10 了,這時候事務A還沒有提交,而此時事務B有可能拿著已經修改過的 age=10 去進行其他操作了,在事務B進行操作的程序中,很有可能事務A由于某些原因,進行了事務回滾操作,那其實事務B得到的就是臟資料了,拿著臟資料去進行其他的計算,那結果肯定也是有問題的,

順著時間軸往表示兩事務中操作的執行順序,重點看圖中 age 欄位的值,

讀未提交,其實就是可以讀到其他事務未提交的資料,但沒有辦法保證你讀到的資料最終一定是提交后的資料,如果中間發生回滾,那就會出現臟資料問題,讀未提交沒辦法解決臟資料問題,更別提可重復讀和幻讀了,想都不要想,

讀提交

既然讀未提交沒辦法解決臟資料問題,那么就有了讀提交,讀提交就是一個事務只能讀到其他事務已經提交過的資料,也就是其他事務呼叫 commit 命令之后的資料,那臟資料問題迎刃而解了,

讀提交事務隔離級別是大多數流行資料庫的默認事務隔離界別,比如 Oracle,但是不是 MySQL 的默認隔離界別,

我們繼續來做一下驗證,首先把事務隔離級別改為讀提交級別,

set global transaction isolation level read committed;

之后需要重新打開新的 session 視窗,也就是新的 shell 視窗才可以,

同樣開啟事務A和事務B兩個事務,在事務A中使用 update 陳述句將 id=1 的記錄行 age 欄位改為 10,此時,在事務B中使用 select 陳述句進行查詢,我們發現在事務A提交之前,事務B中查詢到的記錄 age 一直是1,直到事務A提交,此時在事務B中 select 查詢,發現 age 的值已經是 10 了,

這就出現了一個問題,在同一事務中(本例中的事務B),事務的不同時刻同樣的查詢條件,查詢出來的記錄內容是不一樣的,事務A的提交影響了事務B的查詢結果,這就是不可重復讀,也就是讀提交隔離級別,

每個 select 陳述句都有自己的一份快照,而不是一個事務一份,所以在不同的時刻,查詢出來的資料可能是不一致的,

讀提交解決了臟讀的問題,但是無法做到可重復讀,也沒辦法解決幻讀,

可重復讀

可重復是對比不可重復而言的,上面說不可重復讀是指同一事物不同時刻讀到的資料值可能不一致,而可重復讀是指,事務不會讀到其他事務對已有資料的修改,及時其他事務已提交,也就是說,事務開始時讀到的已有資料是什么,在事務提交前的任意時刻,這些資料的值都是一樣的,但是,對于其他事務新插入的資料是可以讀到的,這也就引發了幻讀問題,

同樣的,需改全域隔離級別為可重復讀級別,

set global transaction isolation level repeatable read;

在這個隔離級別下,啟動兩個事務,兩個事務同時開啟,

首先看一下可重復讀的效果,事務A啟動后修改了資料,并且在事務B之前提交,事務B在事務開始和事務A提交之后兩個時間節點都讀取的資料相同,已經可以看出可重復讀的效果,

可重復讀做到了,這只是針對已有行的更改操作有效,但是對于新插入的行記錄,就沒這么幸運了,幻讀就這么產生了,我們看一下這個程序:

事務A開始后,執行 update 操作,將 age = 1 的記錄的 name 改為“風箏2號”;

事務B開始后,在事務執行完 update 后,執行 insert 操作,插入記錄 age =1,name = 古時的風箏,這和事務A修改的那條記錄值相同,然后提交,

事務B提交后,事務A中執行 select,查詢 age=1 的資料,這時,會發現多了一行,并且發現還有一條 name = 古時的風箏,age = 1 的記錄,這其實就是事務B剛剛插入的,這就是幻讀,

要說明的是,當你在 MySQL 中測驗幻讀的時候,并不會出現上圖的結果,幻讀并沒有發生,MySQL 的可重復讀隔離級別其實解決了幻讀問題,這會在后面的內容說明

串行化

串行化是4種事務隔離級別中隔離效果最好的,解決了臟讀、可重復讀、幻讀的問題,但是效果最差,它將事務的執行變為順序執行,與其他三個隔離級別相比,它就相當于單執行緒,后一個事務的執行必須等待前一個事務結束,

MySQL 中是如何實作事務隔離的

首先說讀未提交,它是性能最好,也可以說它是最野蠻的方式,因為它壓根兒就不加鎖,所以根本談不上什么隔離效果,可以理解為沒有隔離,

再來說串行化,讀的時候加共享鎖,也就是其他事務可以并發讀,但是不能寫,寫的時候加排它鎖,其他事務不能并發寫也不能并發讀,

最后說讀提交和可重復讀,這兩種隔離級別是比較復雜的,既要允許一定的并發,又想要兼顧的解決問題,

實作可重復讀

為了解決不可重復讀,或者為了實作可重復讀,MySQL 采用了 MVVC (多版本并發控制) 的方式,

我們在資料庫表中看到的一行記錄可能實際上有多個版本,每個版本的記錄除了有資料本身外,還要有一個表示版本的欄位,記為 row trx_id,而這個欄位就是使其產生的事務的 id,事務 ID 記為 transaction id,它在事務開始的時候向事務系統申請,按時間先后順序遞增,

按照上面這張圖理解,一行記錄現在有 3 個版本,每一個版本都記錄這使其產生的事務 ID,比如事務A的transaction id 是100,那么版本1的row trx_id 就是 100,同理版本2和版本3,

在上面介紹讀提交和可重復讀的時候都提到了一個詞,叫做快照,學名叫做一致性視圖,這也是可重復讀和不可重復讀的關鍵,可重復讀是在事務開始的時候生成一個當前事務全域性的快照,而讀提交則是每次執行陳述句的時候都重新生成一次快照,

對于一個快照來說,它能夠讀到那些版本資料,要遵循以下規則:

  1. 當前事務內的更新,可以讀到;
  2. 版本未提交,不能讀到;
  3. 版本已提交,但是卻在快照創建后提交的,不能讀到;
  4. 版本已提交,且是在快照創建前提交的,可以讀到;

利用上面的規則,再回傳去套用到讀提交和可重復讀的那兩張圖上就很清晰了,還是要強調,兩者主要的區別就是在快照的創建上,可重復讀僅在事務開始是創建一次,而讀提交每次執行陳述句的時候都要重新創建一次,

并發寫問題

存在這的情況,兩個事務,對同一條資料做修改,最后結果應該是哪個事務的結果呢,肯定要是時間靠后的那個對不對,并且更新之前要先讀資料,這里所說的讀和上面說到的讀不一樣,更新之前的讀叫做“當前讀”,總是當前版本的資料,也就是多版本中最新一次提交的那版,

假設事務A執行 update 操作, update 的時候要對所修改的行加行鎖,這個行鎖會在提交之后才釋放,而在事務A提交之前,事務B也想 update 這行資料,于是申請行鎖,但是由于已經被事務A占有,事務B是申請不到的,此時,事務B就會一直處于等待狀態,直到事務A提交,事務B才能繼續執行,如果事務A的時間太長,那么事務B很有可能出現超時例外,如下圖所示,

加鎖的程序要分有索引和無索引兩種情況,比如下面這條陳述句

update user set age=11 where id = 1

id 是這張表的主鍵,是有索引的情況,那么 MySQL 直接就在索引數中找到了這行資料,然后干凈利落的加上行鎖就可以了,

而下面這條陳述句

update user set age=11 where age=10

表中并沒有為 age 欄位設定索引,所以, MySQL 無法直接定位到這行資料,那怎么辦呢,當然也不是加表鎖了,MySQL 會為這張表中所有行加行鎖,沒錯,是所有行,但是呢,在加上行鎖后,MySQL 會進行一遍過濾,發現不滿足的行就釋放鎖,最終只留下符合條件的行,雖然最終只為符合條件的行加了鎖,但是這一鎖一釋放的程序對性能也是影響極大的,所以,如果是大表的話,建議合理設計索引,如果真的出現這種情況,那很難保證并發度,

解決幻讀

上面介紹可重復讀的時候,那張圖里標示著出現幻讀的地方實際上在 MySQL 中并不會出現,MySQL 已經在可重復讀隔離級別下解決了幻讀的問題,

前面剛說了并發寫問題的解決方式就是行鎖,而解決幻讀用的也是鎖,叫做間隙鎖,MySQL 把行鎖和間隙鎖合并在一起,解決了并發寫和幻讀的問題,這個鎖叫做 Next-Key鎖,

假設現在表中有兩條記錄,并且 age 欄位已經添加了索引,兩條記錄 age 的值分別為 10 和 30,

此時,在資料庫中會為索引維護一套B+樹,用來快速定位行記錄,B+索引樹是有序的,所以會把這張表的索引分割成幾個區間,

如圖所示,分成了3 個區間,(負無窮,10]、(10,30]、(30,正無窮],在這3個區間是可以加間隙鎖的,

之后,我用下面的兩個事務演示一下加鎖程序,

在事務A提交之前,事務B的插入操作只能等待,這就是間隙鎖起得作用,當事務A執行update user set name='風箏2號’ where age = 10; 的時候,由于條件 where age = 10 ,資料庫不僅在 age =10 的行上添加了行鎖,而且在這條記錄的兩邊,也就是(負無窮,10]、(10,30]這兩個區間加了間隙鎖,從而導致事務B插入操作無法完成,只能等待事務A提交,不僅插入 age = 10 的記錄需要等待事務A提交,age<10、10<age<30 的記錄頁無法完成,而大于等于30的記錄則不受影響,這足以解決幻讀問題了,

這是有索引的情況,如果 age 不是索引列,那么資料庫會為整個表加上間隙鎖,所以,如果是沒有索引的話,不管 age 是否大于等于30,都要等待事務A提交才可以成功插入,

總結

MySQL 的 InnoDB 引擎才支持事務,其中可重復讀是默認的隔離級別,

讀未提交和串行化基本上是不需要考慮的隔離級別,前者不加鎖限制,后者相當于單執行緒執行,效率太差,

讀提交解決了臟讀問題,行鎖解決了并發更新的問題,并且 MySQL 在可重復讀級別解決了幻讀問題,是通過行鎖和間隙鎖的組合 Next-Key 鎖實作的,

畫圖真的很費時間,如果對你有幫助的話,那給個推薦吧!


公眾號:古時的風箏

一個斜杠程式員,一個技術公眾號,多寫 Java 相關技術文章,還有更多干貨在公眾號呀,等你來喲!
還可以在公眾號選單加我好友,拉你進入 Java 技術交流群,有不少小伙伴活躍在里面呢,

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/66615.html

標籤:MySQL

上一篇:求指導,如何升級Oracle資料庫

下一篇:Oracle 存盤程序優化查詢

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more