主頁 > 資料庫 > mysql中的事務隔離級別及可重復讀讀提交詳細分析(mvcc多版本控制/undo log)

mysql中的事務隔離級別及可重復讀讀提交詳細分析(mvcc多版本控制/undo log)

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

一.事物隔離級別

  • 讀未提交(read uncommitted)是指,一個事務還沒提交時,它做的變更就能被別的事務看到.通俗理解,別人改資料的事務尚未提交,我在我的事務中也能讀到,
  • 讀提交(read committed)是指,一個事務提交之后,它做的變更才會被其他事務看到,通俗理解,別人改資料的事務已經提交,我在我的事務中才能讀到,
  • 可重復讀(repeatable read)是指,一個事務執行程序中看到的資料,總是跟這個事務在啟動時看到的資料 是一致的,當然在可重復讀隔離級別下,未提交變更對其他事務也是不可見的,通俗理解,別人改資料的事務已經提交,我在我的事務中也不去讀,
  • 串行化(serializable ),顧名思義是對于同一行記錄,“寫”會加“寫鎖”,“讀”會加“讀鎖”,當出現讀寫鎖沖突的時候,后訪問的事務必須等前一個事務執行完成,才能繼續執行,通俗理解,我的事務尚未提交,別人就別想改資料,

圖片示例講解

  • 若隔離級別是“讀未提交”, 則 V1 的值就是 2,這時候事務 B 雖然還沒有提交,但是 結果已經被 A 看到了,因此,V2、V3 也都是 2,
  • 若隔離級別是“讀提交”,則 V1 是 1,V2 的值是 2,事務 B 的更新在提交后才能被 A 看到,所以, V3 的值也是 2,
  • 若隔離級別是“可重復讀”,則 V1、V2 是 1,V3 是 2,之所以 V2 還是 1,遵循的就 是這個要求:事務在執行期間看到的資料前后必須是一致的,
  • 若隔離級別是“串行化”,則在事務 B 執行“將 1 改成 2”的時候,會被鎖住,直到事 務 A 提交后,事務 B 才可以繼續執行,所以從 A 的角度看, V1、V2 值是 1,V3 的值 是 2,
在實作上,資料庫里面會創建一個視圖,訪問的時候以視圖的邏輯結果為準,在“可重復 讀”隔離級別下,這個視圖是在事務啟動時創建的,整個事務存在期間都用這個視圖, 在“讀提交”隔離級別下,這個視圖是在每個 SQL 陳述句開始執行的時候創建的,這里需要 注意的是,“讀未提交”隔離級別下直接回傳記錄上的最新值,沒有視圖概念;而“串行 化”隔離級別下直接用加鎖的方式來避免并行訪問,

二.查看mysql的隔離級別

  • mysql> show variables like 'transaction_isolation';
  • mysql默認級別: repeatable read

三.事務隔離的實作

  • 每條記錄在更新的時候都會同時記錄一潭訓滾操作(也就是說redo log會記錄,undo log也會同時記錄).

  • 記錄上的最新值,通過回滾操作,都可以得到前一個狀態的值,

  • 回滾日志洗掉問題.

    在不需要的時候才洗掉,也就是說,系統會判斷,當沒有事務再需要用到這些回滾日志時,回滾日志會被洗掉,
    什么時候才不需要了呢?就是當系統里沒有比這個回滾日志更早的 read-view 的時候,
    
  • 回滾日志存盤位置

    在 MySQL 5.5 及以前的版本,回滾日志是跟資料字典一起放在 ibdata 檔案里的(系統表空間),即使長 事務最終提交,回滾段被清理,檔案也不會變小,我見過資料只有 20GB,而回滾段有 200GB 的庫,最終只好為了清理回滾段,重建整個庫,
    
  • 回滾流程

四.盡量不要使用長事務

  • 長事務意味著系統里面會存在很老的事務視圖,由于這些事務隨時可能訪問資料庫里面的任何資料,所以這個事務提交之前,資料庫里面它可能用到的回滾記錄都必須保留,這就會導致大量占用存盤空間,

  • 還占用鎖資源,也可能拖垮整個庫

  • 詳解

    比如,在某個時刻(今天上午9:00)開啟了一個事務A(對于可重復讀隔離級別,此時一個視圖read-view A也創建了),這是一個很長的事務……
    
    事務A在今天上午9:20的時候,查詢了一個記錄R1的一個欄位f1的值為1……
    
    今天上午9:25的時候,一個事務B(隨之而來的read-view B)也被開啟了,它更新了R1.f1的值為2(同時也創建了一個由2到1的回滾日志),這是一個短事務,事務隨后就被commit了,
    
    今天上午9:30的時候,一個事務C(隨之而來的read-view C)也被開啟了,它更新了R1.f1的值為3(同時也創建了一個由3到2的回滾日志),這是一個短事務,事務隨后就被commit了,
    
    ……
    
    到了下午3:00了,長事務A還沒有commit,為了保證事務在執行期間看到的資料在前后必須是一致的,那些老的事務視圖、回滾日志就必須存在了(read-view B,read-view C),這就占用了大量的存盤空間,
    
    源于此,我們應該盡量不要使用長事務,
    

在information_schema 庫的 innodb_trx 這個表中查詢長事務

select * from information_schema.innodb_trx where TIME_TO_SEC(timediff(now(),trx_started))>60

五.事務的啟動方式

  • 顯式啟動事務陳述句

    begin 或 start transaction,
    配套的提交陳述句是 commit,
    回滾陳述句是 rollback,
    
  • set autocommit=0,會將執行緒的自動提交關掉.

    意味著如果你只執行一個 select 陳述句,這個事務就啟動了,而且并不會自動提交,這個事務持續存在直到你主 動執行 commit 或 rollback 陳述句,或者斷開連接,
    
  • select也是事物

六.可重復讀隔離級詳細分析

可重復讀隔離級別下的更新和讀取

mysql> CREATE TABLE `t` (
  `id` int(11) NOT NULL, 
  `k` int(11) DEFAULT NULL, 
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;
insert into t(id, k) values(1,1),(2,2);

注意的是事務的啟動時機,

在可重復讀RR隔離級別模式下,begin/start transaction 命令并不是一個事務的起點,在執行到它們之后的第一個操作 InnoDB 表的陳述句,事務才真正啟動,如果你想要馬上啟動一個事務,可以使用 start transaction with consistent snapshot 這個命令,

  • 第一種啟動方式,begin/start transaction一致性視圖是在第執行第一個快照讀陳述句時創建的;
  • 第二種啟動方式,start transaction with consistent snapshot一致性視圖是在執行 start transaction with consistent snapshot 時創建的,

上面圖1執行的結果是:

  • sessionB查詢到的k值為3
  • sessionA查詢到的k值為1
  • 執行順序是,先執行sessionC更新,在執行sessionB更新和查詢,再執行sessionA的查詢
  • 得到上面的執行結果的原因是什么呢,下面分析.

mysql中兩個視圖概念

  • view,它是一個用查詢陳述句定義的虛擬表,在呼叫的時候執行查詢陳述句并生成結 果,創建視圖的語法是 create view ... ,而它的查詢方法與表一樣,
  • InnoDB 在實作 MVCC 時用到的一致性讀視圖,即 consistent read view, 用于支持 RC(Read Committed,讀提交)和 RR(Repeatable Read,可重復讀)隔 離級別的實作,它沒有物理結構,作用是事務執行期間用來定義“我能看到什么資料”,

快照在MVCC里是怎么作業的?

  • 在可重復讀隔離級別下,事務在啟動的時候就“拍了個快照”,注意,這個快照是基于整庫的,

  • InnoDB 里面每個事務有一個唯一的事務 ID,叫作 transaction id,它是在事務開始的時候向 InnoDB 的事務系統申請的,是按申請順序嚴格遞增的,

  • 每行資料也都是有多個版本的,涉及到transaction id

    • 每次事務更新資料的時候,都會生成一個新的資料版本,并且把 transaction id 賦值給這個資料版本的事務 ID,記為 row trx_id

    • 同時,舊的資料版本要保留,并且在新的資料版本中,能夠有資訊可以直接拿到它,

    • 也就是說,資料表中的一行記錄,其實可能有多個版本 (row),每個版本有自己的 row trx_id,

    • 圖中虛線框里是同一行資料的 4 個版本,當前最新版本是 V4,k 的值是 22,它是被transaction id 為 25 的事務更新的,因此它的 row trx_id 也是 25,

    • 前面的文章不是說,陳述句更新會生成 undo log(回滾日志)嗎?那么,undo log 在哪呢?

    • 實際上,圖 2 中的三個虛線箭頭,就是 undo log;而 V1、V2、V3 并不是物理上真實存 在的,而是每次需要的時候根據當前版本和 undo log 計算出來的,比如,需要 V2 的時 候,就是通過 V4 依次執行 U3、U2 算出來,

  • 按照可重復讀的定義,一個事務啟動的時候,能夠看到所有已經提交的事務結果,但是之后,這個事務執行期間,其他事務的更新對它不可見,

  • 一個事務只需要在啟動的時候宣告說,“以我啟動的時刻為準,如果一個資料版本是在我啟動之前生成的,就認;如果是我啟動以后才生成的,我就不認,我必須要找到它的上一個版本”,
    當然,如果“上一個版本”也不可見,那就得繼續往前找,還有,如果是這個事務自己更
    新的資料,它自己還是要認的,

  • 在實作上, InnoDB 為每個事務構造了一個陣列,用來保存這個事務啟動瞬間,當前正 在“活躍”的所有事務 ID,“活躍”指的就是,啟動了但還沒提交,陣列里面事務 ID 的最小值記為低水位,當前系統里面已經創建過的事務 ID 的最大值加 1 記為高水位,這個視圖陣列和高水位,就組成了當前事務的一致性視圖(read-view),

  • 當開啟事務時,需要保存活躍事務的陣列(A),然后獲取高水位(B)兩者中間會不會產生新的事務?

    • A和B之間在事務系統的鎖保護下做的,可以認為是原子操作,期間不能創建事務,
    • 高水位不在視圖陣列里面,高水位應該就是屬于未來未開始事務了
    • 事務A啟動時,當前活躍事務陣列包不包括自己的trx_id,因為如果是自己更新的,總是可見的
  • 資料版本的可見性規則,就是基于資料的 row trx_id 和這個一致性視圖的對比結果得到 的,這個視圖陣列把所有的 row trx_id 分成了幾種不同的情況,

    • 對于當前事務的啟動瞬間來說,假設當前trx id為98 , 在當前事務開始后,計算活躍事務之前又產生了個新事務trx id為99沒有commit,假設活躍事務的id組成的資料為下面的陣列[80,88,99],此時事務80/88/99為活躍事務,99為當前系統中事務最大ID, 高水位100是當前系統最大事務id99加1計算出來的,則會有以下幾種可能:

      1. 如果落在綠色部分,表示這個版本是已提交的事務或者是當前事務自己生成的,這個資料是可見的; 即80以前的事務都可見

      2. 如果落在紅色部分,表示這個版本是由將來啟動的事務生成的,是肯定不可見的; 100及100以后的事務都不可見

      3. 如果落在黃色部分,那就包括兩種情況

        a. 若 row trx_id 在陣列中,表示這個版本是由還沒提交的事務生成的,不可見; 80/88/99為活躍事務,不可見

        b. 若 row trx_id 不在陣列中,表示這個版本是已經提交了的事務生成的,可見,80~99中間,去除80/88/99,比如81等其余的是可見的.

  • InnoDB 利用了“所有資料都有多個版本”的這個特性,利用資料可見性規則實作了“秒級創建快照”的能力,

  • 為什么會出現sessionB查詢到的k值為3,sessionA查詢到的k值為1呢,根據上面的資料可見性分析如下:

    • 這里,我們不妨做如下假設:

      1. 事務 A 開始前,系統里面只有一個活躍事務 ID 是 99;
      2. 事務 A、B、C 的版本號分別是 100、101、102,且當前系統里只有這四個事務;
      3. 三個事務開始前,(1,1)這一行資料的 row trx_id 是 90,
    • 事務 A 的視圖陣列就是 [99,100], 事務 B 的視圖陣列是 [99,100,101], 事務 C 的視 圖陣列是 [99,100,101,102],

      從圖中可以看到,第一個有效更新是事務 C,把資料從 (1,1) 改成了 (1,2),這時候,這個資料的最新版本的 row trx_id 是 102,而 90 這個版本已經成為了歷史版本,
      
      第二個有效更新是事務 B,把資料從 (1,2) 改成了 (1,3),這時候,這個資料的最新版本 (即 row trx_id)是 101,而 102 又成為了歷史版本,{備注:按理說事務B是[99,100,101],此時找到(1,2)的時候判斷出row trx_id=102,比它自己的高水位大,處于紅色區域,不可見,應該往前找,找(1,1)版本,但是此時它卻是找的(1,2)row trx_id=102的版本,這是什么原因的,是因為更新都是“當前讀”(current read),當前讀這個概念下面解釋}
      
      你可能注意到了,在事務 A 查詢的時候,其實事務 B 還沒有提交,但是它生成的 (1,3) 這 個版本已經變成當前版本了,但這個版本對事務 A 必須是不可見的,否則就變成臟讀了,
      
      好,現在事務 A 要來讀資料了,它的視圖陣列是 [99,100],當然了,讀資料都是從當前版本讀起的,所以,事務 A 查詢陳述句的讀資料流程是這樣的:
      		找到 (1,3) 的時候,判斷出 row trx_id=101,比高水位大,處于紅色區域,不可見;
      		接著,找到上一個歷史版本,一看 row trx_id=102,比高水位大,處于紅色區域,不可見;
      		再往前找,終于找到了(1,1),它的 row trx_id=90,比低水位小,處于綠色區域,可見,
      		
      這樣執行下來,雖然期間這一行資料被修改過,但是事務 A 不論在什么時候查詢,看到這 行資料的結果都是一致的,所以我們稱之為一致性讀,
      
  • 上面的分析判斷規則是從代碼邏輯直接轉譯過來的,一個資料版本,對于一個事務視圖來說,除了自己的更新總是可見以外,有三種情況:

    1. 版本未提交,不可見;
    2. 版本已提交,但是是在視圖創建后提交的,不可見;
    3. 版本已提交,而且是在視圖創建前提交的,可見,
    

更新邏輯

事務 B 的 update 陳述句,如果按照一致性讀,好像結果不對 哦?事務 B 的視圖陣列是先生成的,之后事務 C 才提交,不是應該看不見 (1,2) 嗎,怎么能算出 (1,3) 來?

  • 是的,如果事務 B 在更新之前查詢一次資料,這個查詢回傳的 k 的值確實是 1,
  • 但是,當它要去更新資料的時候,就不能再在歷史版本上更新了,否則事務 C 的更新就丟 失了,因此,事務 B 此時的 set k=k+1 是在(1,2)的基礎上進行的操作,
  • 這里就用到了這樣一條規則: 更新資料都是先讀后寫的,而這個讀,只能讀當前的 值,稱為“當前讀”(current read),
  • 因此,在更新的時候,當前讀拿到的資料是 (1,2),更新后生成了新版本的資料 (1,3),這 個新版本的 row trx_id 是 101,
  • 所以,在執行事務 B 查詢陳述句的時候,一看自己的版本號是 101,最新資料的版本號也是 101,是自己的更新,可以直接使用,所以查詢得到的 k 的值是 3,
  • 除了 update 陳述句外,select 陳述句如果加 鎖,也是當前讀,
    • mysql> select k from t where id=1 lock in share mode; 讀鎖(S 鎖,共享鎖)
    • mysql> select k from t where id=1 for update; 寫鎖(X 鎖,排他鎖)

假設事務 C 不是馬上提交的,而是變成了下面的事務 C’

事務 C’的不同是,更新后并沒有馬上提交,在它提交前,事務 B 的更新陳述句先發起了,前面說過了,雖然事務 C’還沒提交,但是 (1,2) 這個版本也已經生成了,并且是當前的 最新版本,那么,事務 B 的更新陳述句會怎么處理呢?

  • 上一篇文章中提到的“兩階段鎖協議”就要上場了
  • 事務 C’ 沒提交,也 就是說 (1,2) 這個版本上的寫鎖還沒釋放,而事務 B 是當前讀,必須要讀最新版本,而且 必須加鎖,因此就被鎖住了,必須等到事務 C’釋放這個鎖,才能繼續它的當前讀,
  • 這樣一致性讀、當前讀和行鎖就串起來了.在一致性讀的環境下,事務C' 執行更新,此時C'沒有commit,事務B就開啟了,因為事務B要進行當前讀,獲取最新的資訊,讀的時候要加鎖(讀完立馬更新),但是此時事務C'還沒有commit,鎖(行鎖)還沒釋放,所以事務B需要等待事務C'釋放鎖之后才能獲取鎖,然后才能執行當前讀,讀到事務B更新了的(1,2),既而更新為(1,3),同時因為(1,3)是事務B自身更新的,所以事務B在查詢id=1的值時,自然而然的就查到了k為3. 但是對于事務A來說,查詢的時候,因為事務C'和事務B的更新都是在事務A開始之后,所以對于事務A都不可見,所以事務A讀取到的值為1. 上面的分析同樣適用于事務A/B/C

可重復讀隔離級別RR核心

  • 核心就是一致性讀(consistent read),正式因為一致性讀的原因,所以本事務開始之后,就算其他事務更新了相關的值,此時本事務還是能查到本事務開始之前的值,而不是其他事務更新后的值.
  • 讀提交的邏輯和可重復讀的邏輯類似,它們最主要的區別是
    • 在可重復讀隔離級別下,只需要在事務開始的時候創建一致性視圖,之后事務里的其他查詢都共用這個一致性視圖;
    • 在讀提交隔離級別下,每一個陳述句執行前都會重新算出一個新的視圖,

讀提交RC隔離級別

start transaction with consistent snapshot; 在都提交下與start transaction等效.

  • 事務 A 的查詢陳述句的視圖陣列是在執行這個陳述句的時候創建的,時序上 (1,2)、(1,3) 的生成時間都在創建這個視圖陣列的時刻之前,
  • 但是(1,3) 還沒提交,屬于情況 1,不可見; (1,2) 提交了,屬于情況 3,可見,
  • 所以,這時候事務 A 查詢陳述句回傳的是 k=2,
  • 顯然地,事務 B 查詢結果 k=3,

站在巨人的肩膀上摘蘋果:

https://time.geekbang.org/column/intro/100020801

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

標籤:MySQL

上一篇:mysql兩個重要的日志redolog和binlog

下一篇:MySQL中的函式索引(Generated Column)及一次SQL優化

標籤雲
其他(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