分類
發燒車訊

老樹畫畫展出60餘件畫作_台中搬家

台中搬家公司費用怎麼算?

擁有20年純熟搬遷經驗,提供免費估價且流程透明更是5星評價的搬家公司

“難得幾個好友,江湖相扶行走。平時兩條微信,見面一杯薄酒。”畫中幾名男子身着長衫、頭戴寬檐帽倚樹而立,在層林盡染的林中小聚,畫面上還配有這首詼諧幽默的小詩。1月3日,“大風吹”老樹畫畫個展在榮寶齋當代藝術館開展,共展出60餘幅老樹的畫作。

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

台中搬家公司推薦超過30年經驗,首選台中大展搬家

作為近年來微博上的紅人畫家,本名劉樹勇的老樹畫畫並非專職畫家,卻吸引了大量網友的喜愛,目前他的微博粉絲多達248萬。老樹畫畫是中央財經大學文化與傳媒學院藝術設計系主任、教授,主要工作是從事視覺語言形態的研究、影像的媒介傳播研究與具體實踐。從2007年提起畫筆到現在,劉樹勇已經斷斷續續畫了十多年,一張張親切自然的水墨小畫配上風趣哲理的打油詩,總能引發人們的共鳴。

“這個小畫展一開始的名字叫風乍起,因為展覽定在初秋。結果一拖再拖,到了年底。昨日大風,被吹得一屁股坐在地上,就改叫大風吹吧。畫畫,或者說活着,只是一件很私人的事兒。盡量畫得好一點,把畫畫得有意思一些,就很不容易了。”對於此次展覽,老樹畫畫的介紹依舊雲淡風輕。他希望好好做自己的事,把畫畫得再誠懇一點。展覽持續至1月9日。(記者 王廣燕)

本站聲明:網站內容來http://www.societynews.cn/html/wh/fq/,如有侵權,請聯繫我們,我們將及時處理

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

台中搬家公司推薦超過30年經驗,首選台中大展搬家

分類
發燒車訊

一個 static 還能難得住我?_台中搬家

台中搬家公司費用怎麼算?

擁有20年純熟搬遷經驗,提供免費估價且流程透明更是5星評價的搬家公司

static 是我們日常生活中經常用到的關鍵字,也是 Java 中非常重要的一個關鍵字,static 可以修飾變量、方法、做靜態代碼塊、靜態導包等,下面我們就來具體聊一聊這個關鍵字,我們先從基礎開始,從基本用法入手,然後分析其原理、優化等。

初識 static 關鍵字

static 修飾變量

static 關鍵字表示的概念是 全局的、靜態的,用它修飾的變量被稱為靜態變量

public class TestStatic {
    
    static int i = 10; // 定義了一個靜態變量 i 
}

靜態變量也被稱為類變量,靜態變量是屬於這個類所有的。什麼意思呢?這其實就是說,static 關鍵字只能定義在類的 {} 中,而不能定義在任何方法中。

就算把方法中的 static 關鍵字去掉也是一樣的。

static 屬於類所有,由類來直接調用 static 修飾的變量,它不需要手動實例化類進行調用

public class TestStatic {

    static int i = 10;

    public static void main(String[] args) {
        System.out.println(TestStatic.i);
    }
}

這裏你需要理解幾個變量的概念

  • 定義在構造方法、代碼塊、方法的變量被稱為實例變量,實例變量的副本數量和實例的數量一樣。
  • 定義在方法、構造方法、代碼塊的變量被稱為局部變量;
  • 定義在方法參數的變量被稱為參數。

詳情參考

static 修飾方法

static 可以修飾方法,被 static 修飾的方法被稱為靜態方法,其實就是在一個方法定義中加上 static 關鍵字進行修飾,例如下面這樣

static void sayHello(){}

《Java 編程思想》在 P86 頁有一句經典的描述

static 方法就是沒有 this 的方法,在 static 內部不能調用非靜態方法,反過來是可以的。而且可以在沒有創建任何對象的前提下,僅僅通過類本身來調用 static 方法,這實際上是 static 方法的主要用途

其中有一句非常重要的話就是 static 方法就是沒有 this 的方法,也就是說,可以在不用創建對象的前提下就能夠訪問 static 方法,如何做到呢?看下面一段代碼

在上面的例子中,由於 staticMethod 是靜態方法,所以能夠使用 類名.變量名進行調用。

因此,如果說想在不創建對象的情況下調用某個方法,就可以將這個方法設置為 static。平常我們見的最多的 static 方法就是 main方 法,至於為什麼 main 方法必須是 static 的,現在應該很清楚了。因為程序在執行 main 方法的時候沒有創建任何對象,因此只有通過類名來訪問。

static 修飾方法的注意事項

  • 首先第一點就是最常用的,不用創建對象,直接類名.變量名 即可訪問;
  • static 修飾的方法內部不能調用非靜態方法;
  • 非靜態方法內部可以調用 static 靜態方法。

static 修飾代碼塊

static 關鍵字可以用來修飾代碼塊,代碼塊分為兩種,一種是使用 {} 代碼塊;一種是 static {} 靜態代碼塊。static 修飾的代碼塊被稱為靜態代碼塊。靜態代碼塊可以置於類中的任何地方,類中可以有多個 static 塊,在類初次被加載的時候,會按照 static 代碼塊的順序來執行,每個 static 修飾的代碼塊只能執行一次。我們會面會說一下代碼塊的加載順序。下面是靜態代碼塊的例子

static 代碼塊可以用來優化程序執行順序,是因為它的特性:只會在類加載的時候執行一次。

static 用作靜態內部類

內部類的使用場景比較少,但是內部類還有具有一些比較有用的。在了解靜態內部類前,我們先看一下內部類的分類

  • 普通內部類
  • 局部內部類
  • 靜態內部類
  • 匿名內部類

靜態內部類就是用 static 修飾的內部類,靜態內部類可以包含靜態成員,也可以包含非靜態成員,但是在非靜態內部類中不可以聲明靜態成員。

靜態內部類有許多作用,由於非靜態內部類的實例創建需要有外部類對象的引用,所以非靜態內部類對象的創建必須依託於外部類的實例;而靜態內部類的實例創建只需依託外部類;

並且由於非靜態內部類對象持有了外部類對象的引用,因此非靜態內部類可以訪問外部類的非靜態成員;而靜態內部類只能訪問外部類的靜態成員;

  • 內部類需要脫離外部類對象來創建實例
  • 避免內部類使用過程中出現內存溢出
public class ClassDemo {
  
    private int a = 10;
    private static int b = 20;

    static class StaticClass{
        public static int c = 30;
        public int d = 40;
      
        public static void print(){
            //下面代碼會報錯,靜態內部類不能訪問外部類實例成員
            //System.out.println(a);
     
            //靜態內部類只可以訪問外部類類成員
            System.out.println("b = "+b);
            
        }
      
        public void print01(){
            //靜態內部內所處的類中的方法,調用靜態內部類的實例方法,屬於外部類中調用靜態內部類的實例方法
            StaticClass sc = new StaticClass();
            sc.print();
        }   
    }
}

靜態導包

不知道你注意到這種現象沒有,比如你使用了 java.util 內的工具類時,你需要導入 java.util 包,才能使用其內部的工具類,如下

但是還有一種導包方式是使用靜態導包,靜態導入就是使用 import static 用來導入某個類或者某個包中的靜態方法或者靜態變量。

import static java.lang.Integer.*;

public class StaticTest {

    public static void main(String[] args) {
        System.out.println(MAX_VALUE);
        System.out.println(toHexString(111));
    }
}

static 進階知識

我們在了解了 static 關鍵字的用法之後,來看一下 static 深入的用法,也就是由淺入深,慢慢來,前戲要夠~

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

台中搬家公司推薦超過30年經驗,首選台中大展搬家

關於 static 的所屬類

static 所修飾的屬性和方法都屬於類的,不會屬於任何對象;它們的調用方式都是 類名.屬性名/方法名,而實例變量和局部變量都是屬於具體的對象實例。

static 修飾變量的存儲位置

首先,先來認識一下 JVM 的不同存儲區域。

  • 虛擬機棧 : Java 虛擬機棧是線程私有的數據區,Java 虛擬機棧的生命周期與線程相同,虛擬機棧也是局部變量的存儲位置。方法在執行過程中,會在虛擬機棧種創建一個 棧幀(stack frame)

  • 本地方法棧: 本地方法棧也是線程私有的數據區,本地方法棧存儲的區域主要是 Java 中使用 native 關鍵字修飾的方法所存儲的區域

  • 程序計數器:程序計數器也是線程私有的數據區,這部分區域用於存儲線程的指令地址,用於判斷線程的分支、循環、跳轉、異常、線程切換和恢復等功能,這些都通過程序計數器來完成。

  • 方法區:方法區是各個線程共享的內存區域,它用於存儲虛擬機加載的 類信息、常量、靜態變量、即時編譯器編譯后的代碼等數據,也就是說,static 修飾的變量存儲在方法區中

  • : 堆是線程共享的數據區,堆是 JVM 中最大的一塊存儲區域,所有的對象實例,包括實例變量都在堆上進行相應的分配。

static 變量的生命周期

static 變量的生命周期與類的生命周期相同,隨類的加載而創建,隨類的銷毀而銷毀;普通成員變量和其所屬的生命周期相同。

static 序列化

我們知道,序列化的目的就是為了 把 Java 對象轉換為字節序列。對象轉換為有序字節流,以便其能夠在網絡上傳輸或者保存在本地文件中。

聲明為 static 和 transient 類型的變量不能被序列化,因為 static 修飾的變量保存在方法區中,只有堆內存才會被序列化。而 transient 關鍵字的作用就是防止對象進行序列化操作。

類加載順序

我們前面提到了類加載順序這麼一個概念,static 修飾的變量和靜態代碼塊在使用前已經被初始化好了,類的初始化順序依次是

加載父類的靜態字段 -> 父類的靜態代碼塊 -> 子類靜態字段 -> 子類靜態代碼塊 -> 父類成員變量(非靜態字段)

-> 父類非靜態代碼塊 -> 父類構造器 -> 子類成員變量 -> 子類非靜態代碼塊 -> 子類構造器

static 經常用作日誌打印

我們在開發過程中,經常會使用 static 關鍵字作為日誌打印,下面這行代碼你應該經常看到

private static final Logger LOGGER = LogFactory.getLoggger(StaticTest.class);

然而把 static 和 final 去掉都可以打印日誌

private final Logger LOGGER = LogFactory.getLoggger(StaticTest.class);
private Logger LOGGER = LogFactory.getLoggger(StaticTest.class);

但是這種打印日誌的方式存在問題

對於每個 StaticTest 的實例化對象都會擁有一個 LOGGER,如果創建了1000個 StaticTest 對象,則會多出1000個Logger 對象,造成資源的浪費,因此通常會將 Logger 對象聲明為 static 變量,這樣一來,能夠減少對內存資源的佔用。

static 經常用作單例模式

由於單例模式指的就是對於不同的類來說,它的副本只有一個,因此 static 可以和單例模式完全匹配。

下面是一個經典的雙重校驗鎖實現單例模式的場景

public class Singleton {
  
    private static volatile Singleton singleton;
 
    private Singleton() {}
 
    public static Singleton getInstance() {
        if (singleton == null) {
            synchronized (Singleton.class) {
                if (singleton == null) {
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }
}

來對上面代碼做一個簡單的描述

使用 static 保證 singleton 變量是靜態的,使用 volatile 保證 singleton 變量的可見性,使用私有構造器確保 Singleton 不能被 new 實例化。

使用 Singleton.getInstance() 獲取 singleton 對象,首先會進行判斷,如果 singleton 為空,會鎖住 Singletion 類對象,這裡有一些小夥伴們可能不知道為什麼需要兩次判斷,這裏來解釋下

如果線程 t1 執行到 singleton == null 后,判斷對象為 null,此時線程把執行權交給了 t2,t2 判斷對象為 null,鎖住 Singleton 類對象,進行下面的判斷和實例化過程。如果不進行第二次判斷的話,那麼 t1 在進行第一次判空后,也會進行實例化過程,此時仍然會創建多個對象。

類的構造器是否是 static 的

這個問題我相信大部分小夥伴都沒有考慮過,在 Java 編程思想中有這麼一句話 類的構造器雖然沒有用 static 修飾,但是實際上是 static 方法,但是並沒有給出實際的解釋,但是這個問題可以從下面幾個方面來回答

  • static 最簡單、最方便記憶的規則就是沒有 this 引用。而在類的構造器中,是有隱含的 this 綁定的,因為構造方法是和類綁定的,從這個角度來看,構造器不是靜態的。
  • 從類的方法這個角度來看,因為 類.方法名不需要新創建對象就能夠訪問,所以從這個角度來看,構造器也不是靜態的
  • 從 JVM 指令角度去看,我們來看一個例子
public class StaticTest {

    public StaticTest(){}

    public static void test(){

    }

    public static void main(String[] args) {
        StaticTest.test();
        StaticTest staticTest = new StaticTest();
    }
}

我們使用 javap -c 生成 StaticTest 的字節碼看一下

public class test.StaticTest {
  public test.StaticTest();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void test();
    Code:
       0: return

  public static void main(java.lang.String[]);
    Code:
       0: invokestatic  #2                  // Method test:()V
       3: new           #3                  // class test/StaticTest
       6: dup
       7: invokespecial #4                  // Method "<init>":()V
      10: astore_1
      11: return
}

我們發現,在調用 static 方法時是使用的 invokestatic 指令,new 對象調用的是 invokespecial 指令,而且在 JVM 規範中 https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.invokestatic 說到

從這個角度來講,invokestatic 指令是專門用來執行 static 方法的指令;invokespecial 是專門用來執行實例方法的指令;從這個角度來講,構造器也不是靜態的。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

台中搬家公司費用怎麼算?

擁有20年純熟搬遷經驗,提供免費估價且流程透明更是5星評價的搬家公司

分類
發燒車訊

「持續更新」市售千元以下 256GB V30 等級記憶卡讀寫效能比一比_台中搬家

台中搬家公司費用怎麼算?

擁有20年純熟搬遷經驗,提供免費估價且流程透明更是5星評價的搬家公司

最近 Micro SD 記憶卡價格不知道為什麼崩得很厲害(開心),所以每次看到有特價就會無聊入手,數量一多就開始挑了,覺得超過千元不買(等特價促銷),速度不夠快不買(V30等級才可穩定錄製 4K 畫質影片,每秒需能穩定寫入30MB/s以上),然後就想說「不然來做專題好了」,所以這篇就誕生啦。其實這個主題想做一陣子了,但一直沒時間寫,而且也要剛好價格有在目標區(千元以下/ V30 速度/256GB或以上)才能做,所以沒有想像中容易,目前先做比較常特價的兩個品牌,之後有看到其他品牌再持續加入。至於為什麼選 Micro SD 記憶卡?主要是手機、GOPRO等行動裝置可用,單眼與筆電裝轉卡也能用(聽說比標準SD容易出搥,但我沒遇過),我覺得比標準 SD 用途廣。

在開始前先以業界標竿「Sandisk」當標準我手邊只有 Sandisk Extreme Pro 128GB V30記憶卡,價格超過千元(笑),不過他是 A2 等級的卡片(A2 的隨機存取表現比 A1好),官方數值號稱 170MB/s讀取,90MB/s寫入,也是最多錄影工作者使用的記憶卡:

測試軟體固定使用 ATTO Disk Benchmark 與 TxBENCH並只看讀取/寫入速度,並使用我手邊速度最快的 金士頓 MobileLite Plus 讀卡機,先強調這是我個人興趣使然也沒有任何贊助的測試,結果僅作參考(記憶卡讀取速度會因為記憶卡本身能力、讀卡機速度、USB連接埠頻寬等因素受到影響,只能盡量大家條件一樣):

目前已知最好的 SanDisk Extreme Pro V30 記憶卡以 ATTO DISK BENCHMARK 速度約 98.6MB讀取/88.1MB寫入:

TxBENCH則是跑出 97.7MB讀取/86.6MB寫入:

業界標竿看完了,就來測其他品牌吧。

達墨 256GB V30 記憶卡

老實講這個品牌我之前沒看過,因為特價好奇才買來試試,名字叫「達墨」(TOPMORE),但圖案看起來明明是達摩的臉呀XD,這張卡廠商終身保固:

以下所有測試都是使用原廠提供的轉卡(轉卡也會影響速度):

ATTO DISK BENCHMARK 速度約 97.6MB讀取/60.5MB寫入:

TxBENCH則是跑出 96.8MB讀取/62.6MB寫入,符合 V30 標準,不過比不上 SanDisk :

這張卡的一般售價大概在1200左右,特價會在990或以下。

美商博帝 265GB V30 記憶卡

這張大概是我看到第一個破千的 256GB V30 記憶卡,目前使用在 DJI OSMO POCKET 上有出現過相容性問題,其他裝置正常,一般價格約 12XX左右,特價會在990以下,廠商保固三年:

美商博帝的速度出乎意料之外的好,ATTO DISK BENCHMARK 速度約 97.6MB讀取/90.5MB寫入:

TxBENCH則是跑出 97.7MB讀取/90.5MB寫入,符合 V30 標準,測試用單眼錄製 4K 影片頗穩定:

 

TEKQ  V30 256GB 記憶卡

TEKQ 這個牌子講實話我也沒看過,這張是momo購物湊運費順便買的,特價8XX元,官方保固10年(我是不奢望可以用這麼久啦),官方宣傳只講讀取可達100MB/s,寫入完全沒提,講實話我本來完全對他沒有期待:

一測不得了,他的讀寫速度比帝博與 SanDisk還要快,ATTO DISK BENCHMARK 速度約 99.2MB讀取/91.7MB寫入:

TxBENCH則是跑出 98.4MB讀取/89.6MB寫入,符合 V30 標準,這片大概是目前我測過價格最低的高速卡(特價期間):

 

 

KLEVV 科賦 Micro SDXC UHS-1 U3 V30 A2 256GB 記憶卡

這片是PCHOME特價時入手的,價格699元(原價11XX元,目前999元),官方號稱終身保固,一樣是V30號稱讀寫破百:
 

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

台中搬家公司推薦超過30年經驗,首選台中大展搬家

ATTO DISK BENCHMARK 速度約 98.5MB讀取/85.4MB寫入:

TxBENCH則是跑出 97.3MB讀取/84.2MB寫入,符合 V30 標準:

 

威剛 Premier Pro microSDXC UHS-I U3 A2 V30 256G記憶卡

這片是PCHOME特價時入手的,價格999元(原價1499元),優點是官方號稱終身保固,一樣是V30、A2等級號稱讀取100MB/s寫入達80 MB/s:

ATTO DISK BENCHMARK 速度約 98.8MB讀取/65.2MB寫入:

TxBENCH則是跑出 98.4MB讀取/56.4MB寫入,符合 V30 標準,但跟官方自己宣稱的寫入有 80MB/s還是有差距,算是合格以上表現,主要優點還是終身保(威剛應該算穩):

SAMSUNG 三星 EVO Plus microSDXC UHS-I(U3) Class10 256GB記憶卡

這片是PCHOME特價時入手的,價格888元(目前還是888元),三星官方十年保固,一樣是V30等級號稱讀取100MB/s寫入達85 MB/s:

ATTO DISK BENCHMARK 速度約 99MB讀取/86.1MB寫入:

TxBENCH則是跑出 98.4MB讀取/86.4MB寫入,符合 V30 標準,表現優異,保固也長可以買:

 

TCELL冠元 SUPERIOR+ microSDXC UHS-I(A2)U3 V30 100/85MB 256GB 記憶卡

這片是PCHOME特價時入手的,價格799元(原價1499),原廠終身保固,一樣是V30 A2等級,號稱讀取100MB/s寫入達90 MB/s:

ATTO DISK BENCHMARK 速度約 99.8MB讀取/88MB寫入:

TxBENCH則是跑出 98MB讀取/87.2MB寫入,符合 V30 標準,表現優異,原廠還終身保固,可以趁特價買:

 

SanDisk Extreme microSDXC UHS-I(V30)(A2)256GB 記憶卡

這張SanDisk Extreme microSDXC UHS-I(V30)(A2)256GB 記憶卡是 PCHOME 雙11購物特價時購買,特價939元(現在恢復原價 1299元),公司貨終身保固,在包裝上標誌V30 A2 等級讀取 160 MB、寫入高達90MB,講實話本來以為是吹牛皮:

一測不得了,讀寫速度是目前測過最好表現,ATTO DISK BENCHMARK 速度約 169.1MB讀取/104.6MB寫入:

TxBENCH則是跑出 168MB讀取/104.6MB寫入,符合 V30 標準,這片大概是目前我測過最快的高速卡,根本與宣稱數值不一樣呀,超過官方數據是哪招?只能說它廣告不實了,如果有特價別猶豫立刻入手:

之後如果有看到便宜又大碗的記憶卡阿達再推坑啦,目前為止SanDisk Extreme microSDXC UHS-I(V30)(A2)256GB 記憶卡表現最好、性價比三星不錯(888元)、達墨/ADATA最普,不過受測的卡都有超過 V30 標準,大家選購時可依照價格、保固與喜好選擇。

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

台中搬家公司推薦超過30年經驗,首選台中大展搬家

分類
發燒車訊

日本網友異想天開使用民間散熱法 + 散熱片幫 MacBook 散熱,結果螢幕不小心蓋上整個毀了_台中搬家

台中搬家公司費用怎麼算?

擁有20年純熟搬遷經驗,提供免費估價且流程透明更是5星評價的搬家公司

相信很多人應該多少都曾聽過把硬幣放在電腦最熱處,可以幫助散熱的民間散熱法,不過這在台灣沒那麼紅,但日本可不一樣,即使到了 2020 年,Twitter 上還是隨處可見有人分享他使用這種散熱方式,最近就有一位日本網友更異想天開,除了放上硬幣外,每一個硬幣還再加上散熱片,來提升散熱性,結果卻發生慘烈悲劇,某次不小心把螢幕蓋起來,再次打開螢幕就毀了。

日本網友異想天開使用民間散熱法 + 散熱片幫 MacBook 散熱,結果螢幕不小心蓋上整個毀了

一直以來 MacBook 的散熱設計雖然不差,但這麼貴的一台筆電,每一個人買回家一定會想要好好的愛護,當使用一段時間或長時間 MacBook 都處於高速運算狀態,鍵盤上方位置(轉軸處)都會比較燙,也因此坊間就流傳放上硬幣可以幫助散熱,甚至連日本媒體都特別針對此事做報導。

當然,這民間散熱法確實有效,不過這位日本網友不知是嫌散熱不夠還是怎樣,竟然再加上散熱片,推文還寫著:這可以讓 MacBook 更加舒適快活。至於有沒有效,他就沒有特別說明,當時(10/5)也沒有引起太多討論:

MacBookをさらに快適に過ごすためにヒートシンク付き10円玉を導入したぞ pic.twitter.com/ebG5RPHsgL

— Shin Adachi (@shn) October 5, 2020

過了 2 個多月,上週他再度分享一張 MacBook 左半邊螢幕有一大條整個毀損的照片,並寫著 “引以為戒”,隨後他解釋,造成這意外是某次他忘記把散熱片與硬幣拿出,就蓋上 MacBook 導致,因此他不推薦這方法(笑):

戒め pic.twitter.com/jsqYQXcRTH

— Shin Adachi (@shn) December 22, 2020

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

台中搬家公司推薦超過30年經驗,首選台中大展搬家

如果只有單純的硬幣,蓋上時不至於對螢幕造成這麼大的傷害,畢竟是平面,但散熱片上方有著凹凸設計,因此只要稍微出力蓋上,螢幕就立刻被壓迫到。

所以說,對於健忘的人來說,還是不推薦使用這種坊間散熱法,直接買台筆電用的散熱器比較實在。新款 M1 MacBook 應該就不太有這問題,功耗非常的低。

即使到了 2020 年,日本還是有不少使用 10 日圓硬幣散熱的 Twitter 推文:

而且似乎很流行這種放很多硬幣的方式,不過相較於只放一個,放多個確實也比較安全一點,蓋上時會整個倒下來,可以立即提醒:

日本玩家送修 Wii U 意外找回結婚戒指,任天堂還幫他清洗乾淨

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

台中搬家公司費用怎麼算?

擁有20年純熟搬遷經驗,提供免費估價且流程透明更是5星評價的搬家公司

分類
發燒車訊

MySQL 可重複讀,差點就讓我背上了一個 P0 事故!_台中搬家

台中搬家公司費用怎麼算?

擁有20年純熟搬遷經驗,提供免費估價且流程透明更是5星評價的搬家公司

小黑黑的碎碎念

哎,最近有點忙,備考複習不利,明天還要搬家,好難啊!!

本想着這周鴿了,但是想想還是不行,爬起來,更新一下,周更可不能斷。偷懶一下,修改一下之前的一篇歷史文章,重新發布一下。

先贊后看,微信搜索「程序通事」,關注就完事了

P0 事故:餘額多扣!

這是一個真實的生產事件,事件起因如下:

現有一個交易系統,每次產生交易都會更新相應賬戶的餘額,出賬扣減餘額,入賬增加餘額。

為了保證資金安全,餘額發生扣減時,需要比較現有餘額與扣減金額大小,若扣減金額大於現有餘額,扣減餘額不足,扣減失敗。

賬戶表(省去其他字段)結構如下:

CREATE TABLE `account`
(
    `id`      bigint(20) NOT NULL,
    `balance` bigint(20) DEFAULT NULL,
    PRIMARY KEY (`id`)

) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4
  COLLATE = utf8mb4_bin;

扣減餘額時,sql 語序如下所示:

ps:看到上面的語序,有沒有個小問號?為什麼相同查詢了這麼多次?

其實這些 SQL 語序並不在同個方法內,並且有些方法被抽出復用,所以導致一些相同查詢結果沒辦法往下傳遞,所以只得再次從數據庫中查詢。

為了防止併發更新餘額,在 t3 時刻,使用寫鎖鎖住該行記錄。若加鎖成功,其他線程的若也執行到 t3,將會被阻塞,直到前一個線程事務提交。

t5 時刻,進入到下一個方法,再次獲取賬戶餘額,然後在 Java 方法內比較餘額與扣減金額,若餘額充足,在 t7 時刻執行更新操作。

上面的 SQL 語序看起來沒有什麼問題吧,實際也是這樣的,賬戶系統已經在生產運行很久,沒出現什麼問題。但是這裏需要說一個前提,系統數據庫是 Oracle

但是從上面表結構,可以得知此次數據庫被切換成 MySQL,系統其他任何代碼以及配置都不修改(sql 存在小改動)。

就是這種情況下,併發執行發生餘額多扣,即實際餘額明明小於扣減金額,但是卻做了餘額更新操作,最後導致餘額變成了負數。

下面我們來重現併發這種情況,假設有兩個事務正在發執行該語序,執行順序如圖所示。

注意點:數據庫使用的是 MySQL,默認事務隔離等級,即 RR。數據庫記錄為 id=1 balance=1000,假設只有當時只有這兩個事務在執行。

各位讀者可以先思考一下,t2,t3,t4,t5,t6,t11 時刻餘額多少。

下面貼一下事務隔離等級RR 下的答案。

事務1 的查詢結果為:

  • t2 (1,1000)
  • t4 (1,1000)
  • t6 (1,1000)

事務 2 的查詢結果為:

  • t3 (1,1000)
  • t5 (1,900)
  • t11 (1,1000)

有沒有跟你想的結果的一樣?

接着將事務隔離等級修改成 RC,同樣再來思考一下 t2,t3,t4,t5,t6,t11 時刻餘額。

再次貼下事務隔離等級RC 下的答案。

事務1 的查詢結果為:

  • t2 (1,1000)
  • t4 (1,1000)
  • t6 (1,1000)

事務 2 的查詢結果為:

  • t3 (1,1000)
  • t5 (1,900)
  • t11 (1,900)

事務 1 的查詢結果,大家應該會沒有什麼問題,主要疑問點應該在於事務 2,為什麼換了事務隔離等級結果卻不太一樣?

下面我們先帶着疑問,了解一下 MySQL 的相關原理 ,看完你就會明白這一切。

  • MVCC
  • 一致性視圖
  • 快照讀與當前讀

MVCC

我們先來看下一個簡單的例子,

事務隔離等級為 RR , id=1 balance=1000

事務 1 將 id=1 記錄 balance 更新為 900,接着事務 2 在 t5 時刻查詢該行記錄結果,很顯然該行記錄應該為 id=1 balance=1000

如果 t5 查詢最新結果 id=1 balance=900,這就讀取到事務 1 未提交的數據,顯然不符合當前事務隔離級別

從上面例子可以看到 id=1 的記錄存在兩個版本,事務 1 版本記錄為 balance=1000 ,事務 2 版本記錄為 balance=900

上述功能,MySQL 使用 MVCC 機制實現功能。

MVCC:Multiversion concurrency control,多版本併發控制。摘錄一段淘寶數據庫月報的解釋:

多版本控制: 指的是一種提高併發的技術。最早的數據庫系統,只有讀讀之間可以併發,讀寫,寫讀,寫寫都要阻塞。引入多版本之後,只有寫寫之間相互阻塞,其他三種操作都可以并行,這樣大幅度提高了InnoDB的併發度。在內部實現中,與Postgres在數據行上實現多版本不同,InnoDB是在undolog中實現的,通過undolog可以找回數據的歷史版本。找回的數據歷史版本可以提供給用戶讀(按照隔離級別的定義,有些讀請求只能看到比較老的數據版本),也可以在回滾的時候覆蓋數據頁上的數據。在InnoDB內部中,會記錄一個全局的活躍讀寫事務數組,其主要用來判斷事務的可見性。

可以看到 MVCC 主要用來提高併發,還可以用來讀取老版本數據。

在學習 MVCC 原理之前,首先我們需要了解 MySQL 記錄結構。

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

台中搬家公司推薦超過30年經驗,首選台中大展搬家

如上圖所示,account 表一行記錄,除了真實數據之外,還會存在三個隱藏字段,用來記錄額外信息。

  • DB_TRX_ID:事務id。

  • DB_ROLL_PTR: 回滾指針,指向 undolog。

  • ROW_ID:行 id,與此次無關。

MySQL InnoDB 裏面每個事務都會有一個唯一事務 ID,它在事務開始的時候會跟 InnoDB 的事務系統申請的,並且嚴格按照順序遞增的。

每次事務更新數據時,將會生成一個新的數據版本,然後會把當前的事務 id 賦值給當前記錄的 DB_TRX_ID。並且數據更新記錄(1,1000—->1,900)將會記錄在 undo log(回滾日誌)中,然後使用當前記錄的 DB_ROLL_PTR 指向 und olog。

這樣 MySQL 就可以通過 DB_ROLL_PTR 找到 undolog 推導出之前版本記錄內容。

查找過程如下:

若需要知道 V1 版本記錄,首先根據當前版本 V3 的 DB_ROLL_PTR 找到 undolog,然後根據 undolog 內容,計算出上一個版本 V2。以此類推,最終找到 V1 這個版本記錄。

V1,V2 並不是物理記錄,沒有真實存在,僅僅具有邏輯意義。

一行數據記錄可能同時存在多個版本,但並不是所有記錄都能對當前事務可見。不然上面 t5 就可能查詢到最新的數據。所以查找數據版本時候 MySQL 必須判斷數據版本是否對當前事務可見

一致性視圖

MySQL 會在事務開始后建立一個一致性視圖(並不是立刻建立),在這個視圖中,會保存所有活躍的事務(還未提交的事務)。

假設當前事務保存活躍事務數組為如下圖。

判斷版本對於當前事務是否可見時,基於以下規則判斷:

  1. 若版本事務 id 小於當前活躍事務 id 數組最小值,比如版本 id 為 40,小於活躍數組最小值 45。這就代表當前版本的事務已提交,當前版本對於當前事務可見。

  2. 若版本事務 id 大於當前活躍事務數組的最大值,如版本事務 id 為 100, 大於數組最大事務 id 90。說明了這個版本是當前事務創建之後生成,所以這個版本對於當前事務不可見。

  3. 若版本事務 id 是當前活躍數組事務之一,比如版本事務 id 為 56。代表記錄版本所屬事務還未提交,所以該版本對於當前事務不可見。

  4. 若版本事務 id 不是當前活躍數組事務之一,但是事務 id 位於活躍數組最小值與最大值之一,比如如事務 ID 57。代表當前記錄事務已提交,所以該版本對於當前事務可見。

  5. 若版本事務 id 為當前事務 id,代表該行數據是當前事務變更的,當然得可見。

4 這個規則可能比較繞,結合上面圖片比較好理解。

以上判斷規則可能比較抽象,看不懂,沒事,我們再用大白話解釋一下:

  1. 未提交事務生成的記錄版本,不可見。

  2. 視圖生成前,已提交事務生成記錄版本可見。

  3. 視圖生成后,新事務生成記錄版本不可見。

  4. 自身事務更新永遠可見。

一致性視圖只會在 RR 與 RC 下才會生成,對於 RR 來說,一致性視圖會在第一個查詢語句的時候生成。而對於 RC 來說,每個查詢語句都會重新生成視圖。

當前讀與快照讀

MySQL 使用 MVCC 機制,可以讀取之前版本數據。這些舊版本記錄不會且也無法再去修改,就像快照一樣。所以我們將這種查詢稱為快照讀

當然並不是所有查詢都是快照讀,select …. for update/ in share mode 這類加鎖查詢只會查詢當前記錄最新版本數據。我們將這種查詢稱為當前讀。

問題分析

講完原理之後,我們回過頭分析一下上面查詢結果的原因。

這裏我們將上面答案再貼過來。

事務隔離級別為 RR,t2,t3 時刻兩個事務由於查詢語句,分別建立了一致性視圖。

t4 時刻,由於事務 1 使用 select.. for update 為 id=1 這一行上了一把鎖,然後獲取到最新結果。而 t5 時刻,由於該行已被上鎖,事務 2 必須等待事務 1 釋放鎖才能繼續執行。

t6 時刻根據一致性視圖,不能讀取到其他事務提交的版本,所以數據沒變。t8 時刻餘額扣減 100,t9 時刻提交事務。

此時最新版本記錄為 id=1 balance=900

由於事務 1 事務已提交,行鎖被釋放,t5 成功獲取到鎖。由於 t5 是當前讀,所以查詢的結果為最新版本數據(1,900)。

重點來了,當前這條記錄的最新版本數據為 (1,900),但是最新版本事務 id,卻是事務 2 創建之後未提交的事務,位於活躍事務數組中。所以最新記錄版本對於事務 2 是不可見的。

沒辦法只能根據 undolog 去讀取上一版本記錄 (1,1000) ,這個版本記錄剛好對於事務 2 可見,所以 t11 的記錄為 (1,1000)

而當我們將事務隔離等級修改成 RC,每次都會重新生成一致性視圖。所以 t11 時刻重新生成了一致性視圖,這時候事務 1 已提交,當前最新版本的記錄對於事務 2 可見,所以 t11 的結果將會變為 (1,900)

總結

MySQL 默認事務隔離等級為 RR,每一行數據(InnoDB)的都可以有多個版本,而每個版本都有獨一的事務 id。

MySQL 通過一致性視圖確保數據版本的可見性,相關規則總結如下:

  • 對於 RR 事務隔離等級,普通查詢僅能查到事務啟動前就已經提交完成的版本數據。
  • 對於 RC 事務隔離等級,普通查詢可以查到查詢語句啟動前就已經提交完成的版本數據。
  • 當前讀總是讀取最新版本的數據。

幫助文檔

1: https://dev.mysql.com/doc/refman/8.0/en/innodb-multi-versioning.html
2 http://mysql.taobao.org/monthly/2017/12/01/
3 http://mysql.taobao.org/monthly/2018/11/04/
4 https://dev.mysql.com/doc/refman/8.0/en/innodb-consistent-read.html
5 極客時間- MySQL 專欄–事務到底是隔離的還是不隔離的

歡迎關注我的公眾號:程序通事,獲得日常乾貨推送。如果您對我的專題內容感興趣,也可以關注我的博客:studyidea.cn

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

台中搬家公司費用怎麼算?

擁有20年純熟搬遷經驗,提供免費估價且流程透明更是5星評價的搬家公司

分類
發燒車訊

10萬自主SUV怎麼選 工薪家庭的最愛哪些車?_台中搬家

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

台中搬家公司推薦超過30年經驗,首選台中大展搬家

0理念設計的首款SUV,造型非常的個性張揚,整體輪廓結實富有力量感,凌雲翼式的家族進氣格柵看上去很大氣端莊,層次感豐富。內飾雖然設計得比較簡單,但是很有特色,環抱式的設計搭配鋼琴烤漆面板和鍍鉻飾件,營造了很上檔次的氛圍,而六邊形的中控台和按鍵都是很有個性的設計,胎壓監測、上坡輔助、陡坡緩降、定速巡航、前排座椅加熱等配置非常豐富。

江鈴汽車-馭勝S330

指導價:8.88-14.08萬

馭勝S330外觀非常年輕時尚,車頭設計得非常穩重,誇張的大進氣格柵搭配着兩側的C型日間行車燈,給人很兇猛的感覺,車身側面的腰線強而有力,懸浮式的車頂非常炫酷,后尾燈的造型與頭燈相互呼應,非常耐看。

中控台的造型較為方正,運用了大量平直的線條,整體看上很簡潔、大氣,軟質材料包裹,鍍鉻飾件、真皮等材質處理過的中控台質感上面還是很不錯的,觸碰感應的中控區域沒有任何物理按鍵,很有科技感,無鑰匙進入/啟動、感應雨刷、自動頭燈、倒車影像等配置應有盡有。

座椅的造型比較運動,填充物的軟硬適中,乘坐感受還是挺舒適的,腿部空間很寬敞,全景天窗也是其一大亮點,後備箱大小也足夠日常使用;全系標配1.5T發動機最大功率163馬力,搭配6擋手動或者6擋手自一體變速器,動力輸出較為平順,底盤調校以舒適為主。

廣汽乘用車-傳祺GS4

指導價:9.98-15.38萬

傳祺GS4算得上是來勢洶洶的一輛SUV了,一上市的銷量就破萬,這也難怪,其外觀的自主原創度非常高,是廣汽採用光影雕塑2.0理念設計的首款SUV,

台中搬家公司費用怎麼算?

擁有20年純熟搬遷經驗,提供免費估價且流程透明更是5星評價的搬家公司

造型非常的個性張揚,整體輪廓結實富有力量感,凌雲翼式的家族進氣格柵看上去很大氣端莊,層次感豐富。

內飾雖然設計得比較簡單,但是很有特色,環抱式的設計搭配鋼琴烤漆面板和鍍鉻飾件,營造了很上檔次的氛圍,而六邊形的中控台和按鍵都是很有個性的設計,胎壓監測、上坡輔助、陡坡緩降、定速巡航、前排座椅加熱等配置非常豐富。

4510*1852*1708mm的車身尺寸在同級別車型中不佔優勢,但是實際空間表現還是令人滿意的,身高180cm的體驗者後排腿部空間達到兩拳,頭部空間還有一拳,1.3T發動機採用多點電噴、雙渦管渦輪增壓等技術,最大功率137馬力,已經達到部分2.0L自吸發動機的水平了,搭配7速雙離合變速器,低扭表現充足,動力輸出線性。

長城汽車-哈弗H2

指導價:8.68-12.88萬

對於哈弗的車型有人就搞不清楚了 ,紅標藍標的糾結是什麼鬼,其實這個就是哈弗產品線戰略,紅色LOGO車型側重豪華,實用;而藍色LOGO車型更加運動時尚,哈弗H2的整個風格更偏向於運動,六邊形的進氣格柵更加個性化,雙邊雙出的排氣管運動氣息濃厚。

藍標H2的內飾中控台材質用料更加講究,鍍鉻飾條、烤漆面板的合理搭配營造了很好的質感享受,真皮打孔的方向盤手感不錯,电子駐車和自動駐車是藍標全系標配,非常的厚道,自動頭燈、倒車影像、無鑰匙進入/啟動、胎壓監測等配置一應俱全。

雙色拼接的座椅看起來很時尚,2560mm軸距帶來的空間感受中規中矩,儲物空間也比較豐富,滿足日常使用,動力是大家熟悉的1.5T發動機最大功率150馬力,搭配6擋手動或者6擋手自一體變速箱,動力強勁,加速很線性,前後獨立懸挂的組合兼顧操控以及舒適性。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

台中搬家公司推薦超過30年經驗,首選台中大展搬家

分類
發燒車訊

Apple 準備好了?爆料者披露該公司預計將在三月推出有 12 核心的新 Mac_台中搬家

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

台中搬家公司推薦超過30年經驗,首選台中大展搬家

Apple 透過 M1 這顆整合了自家技術實力在內的新處理器,向世界宣示要讓 Mac 從此走入採用自製處理器的新里程碑。不過光是 M1 的效能強悍還不夠,很多在電腦效能上需求更高的用戶仍然不夠滿意。畢竟先不說效能上還有許多相容問題需要克服,M1 畢竟是針對筆電使用情境而生的省電型處理器。Apple 還缺乏一顆夠強的桌上型電腦用的處理器。有爆料者就稱,Apple 很快會推出 Apple Silicon 的第二顆處理器,而且這個處理器將具有 12 核心:

▲(圖片來源)

M1 的威力很多人都領教到了。雖然這個打頭陣的先鋒在玩家眼中仍然有許多進步空間,例如軟體相容性之類的問題。但 Apple 確實讓 M1 收穫了許多用戶的心。一個效能上打旗艦處理器,節能又打擊許多超低電壓處理器的新鮮玩意,即便有許多缺點存在,仍然讓許多用戶痴迷不已。

M1 後繼處理器將具備 12 核心,可能在三月問世

不過,M1 的後繼者會不會有更好的表現,並且要等待多久才會推出,這些都是很多焦急的高階用戶關心的地方。要知道 M1 效能雖強,但對於重度應用來說仍有所不足之處。用戶仍然希望 Apple 盡快把更快的處理器生產出來,應用在新 Mac 上。

一位 Twitter 用戶 LeaksApplePro 就挖掘了一條關於新處理器的八卦出來。,表示 Apple 將在三月推出新的處理器,這顆處理器目前型號不明,按照過去慣例,可能叫做 M1X 或 M2。除此之外更爆料新處理器具備更多的 12 核心。如果架構相近甚至幾乎一樣的話,更多的核心理所當然的效能會更高。若是全新架構,那麼處理器蘊藏的潛能恐怕要比現在的 M1 更強更快也說不定:

▲(翻攝自Twitter)

這顆處理器會應用在哪裡呢?根據名分析師郭明錤的推測,新的 Macbook Pro 將於 2021 年第二季問世,除了是重新設計的外觀外,還具備 14 與 16 兩種螢幕尺寸的版本。如此看來,這個 12 核心的新處理器或許就在新的 Macbook Pro 上推出。但也有玩家認為,Apple 至今尚未推出 Apple Silicon 版的 iMac 電腦,或許下次看到新 iMac 或 iMac Pro 電腦發表時,就是搭載新處理器的時候:

▲(圖片來源)

台中搬家公司費用怎麼算?

擁有20年純熟搬遷經驗,提供免費估價且流程透明更是5星評價的搬家公司

不過,關於桌上型電腦的部分,Apple 具傳正在開發採用 5nm 製程的 A14T 晶片來應用在桌機上。由於桌機不似筆電那樣需要續航力的部分,或許這顆 A14T 才會是新 iMac 所採用的處理器。但 A14T 與這個謠傳 12 核心的新處理器是不是同一個,則要看 Apple 官方公布時給出的資訊是哪一個啦。

消息來源:LeaksApplePro、wccftech

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

台中搬家公司推薦超過30年經驗,首選台中大展搬家

分類
發燒車訊

小米 10i 5G 印度發表:搭載高通 750G 5G 處理器、1.08 億像素主相機、 120Hz更新率螢幕與 4820mAh 大電量_台中搬家

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

台中搬家公司推薦超過30年經驗,首選台中大展搬家

小米在中國、印度以及其他海外市場,經常會有些手機以不同名稱在當地推出,像是昨(5)日才剛於印度發表的「小米 10i 5G」就是很好的例子。昨天小米在印度發表小米 10i 5G 這款新機,眼尖的人或許會發現他有些眼熟,因為它其實就是去年小米在中國推出的 Redmi Note 9 Pro 更名上市新機。

小米 10i 5G 印度發表:搭載高通 750G 5G 處理器、1.08 億像素主相機、 120Hz更新率螢幕與 4820mAh 大電量

去年印度率先發表 Redmi Note 9 Pro ,隨後在中國也推出了 Redmi Note 9 Pro 但在外觀、規格皆與印度版本不同。近日小米於印度發表「小米 10i 5G」新機,也就是中國版的 Redmi Note 9 Pro 。
硬體規格方面,小米 10i 5G 搭載 Qualcomm Snapdragon 750G 5G 處理器、配備最高 8GB LPDDR4X RAM、256GB UFS2.2 ROM :

相機方面,小米 10i 5G 配備 1.08 億像素四鏡頭主相機,鏡頭依序為 1.08 億像素標準鏡頭(Samsung ISOCELL HM2 感光元件)、800 萬像素 120° 超廣角鏡頭、200 萬像素微距鏡頭以及 200 萬像素景深鏡頭,前置鏡頭則配被 1600 萬像素自拍相機。

小米 10i 5G 採用 6.67 吋 FHD+ 解析度螢幕,螢幕具備 120Hz 更新率、240Hz 觸控採樣率,顯示支持 HDR10 格式。此外,螢幕採用康寧第五代大猩猩玻璃保護,小米 10i 5G 也具備 IP53 防潑水等級。

電量方面,小米 10i 5G 內建 4820mAh 大電量電池,支持 33W 功率的有線快充能在 58 分鐘為小米 10i 充電至 100% :

其他方面,小米 10i 5G 亦具備 NFC、保留 3.5mm 耳機孔以及採用側邊指紋辨識器進行指紋辨識解鎖。顏色方面,小米 10i 5G 在印度推出 Midnight Black(午夜黑)、Atlantic Blue(大西洋藍)以及帶有漸層色的 Pacific Sunrise(太平洋日出)等三種配色選擇。

小米 10i 5G 在印度共推出三個版本,價格依序為 6GB+64GB 版本售價 23,999  印度盧比(約合新台幣 9,153 元)、8GB+128GB 版本售價 24,999 印度盧比(約合新台幣 9,534 元)、8GB+256GB 版本售價 27,999 印度盧比(約合新台幣 10,678 元),在當地使用特定銀行卡可享 2,000 印度盧比的折扣。

台中搬家公司費用怎麼算?

擁有20年純熟搬遷經驗,提供免費估價且流程透明更是5星評價的搬家公司

圖片/消息來源:Mi India

延伸閱讀:
Redmi K40 Pro 最新渲染圖曝光:可能是最便宜的 S888 旗艦 5G 手機之一

疑似 OPPO Find X3 安兔兔跑分曝光,搭載高通 S888 旗艦處理器測出 77.1 萬分刷新最高分紀錄

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

台中搬家公司推薦超過30年經驗,首選台中大展搬家

分類
發燒車訊

MySql輕鬆入門系列——第一站 從源碼角度輕鬆認識mysql整體框架圖_台中搬家

台中搬家公司費用怎麼算?

擁有20年純熟搬遷經驗,提供免費估價且流程透明更是5星評價的搬家公司

一:背景

1. 講故事

最近看各大技術社區,不管是知乎,掘金,博客園,csdn基本上看不到有小夥伴分享sqlserver類的文章,看來在國內大環境下是不怎麼流行了,看樣子我再寫sqlserver是不可能再寫了,這輩子都不會寫了,只能靠技術輸出mysql維持生活這樣子。

二:了解架構圖

mysql最大的好處就是開源, 手握百萬源碼,有什麼問題搞不定呢? 這一點要比sqlserver爽多了,不用再dbcc搗來搗去。

1. 從架構圖入手

大家都知道做/裝修房子都要有一張圖紙,其實軟件也是一樣,只要有了這麼一張圖紙,大方向就定下來了,再深入到細節也不會亂了方向,然後給大家看一下我自己畫的架構圖,畫的不對請輕拍。

其實SqlServer,Oracle,MySql架構都大同小異,MySql的鮮明特點就是存儲引擎做成了插拔式,這就牛逼了,現行最常用的是InnoDB,這就讓我有了一個想法,有一套業務準備用 InMemory 模式跑一下,厲害了~~~

2. 功能點介紹

MySql其實就兩大塊,一塊是MySql Server層,一塊就是Storage Engines層。

<1> Client

不同語言的sdk遵守mysql協議就可以與mysqld進行互通。

<2> Connection/Thread Pool

MySql使用C++編寫,Connection是非常寶貴的,在初始化的時候維護一個池。

<3> SqlInterface,Parse,Optimizer,Cache

對sql處理,解析,優化,緩存等處理和過濾模塊,了解了解即可。

<4> Storage Engines

負責存儲的模塊,官方,第三方,甚至是你自己都可以自定義實現這個數據存儲,這就把生態做起來了,。

三: 源碼分析

關於怎麼去下載mysql源碼,這裏就不說了,大家自己去官網搗鼓搗鼓哈,本系列使用經典的 mysql 5.7.14版本。

1. 了解mysql是如何啟動監聽的

手握百萬行源碼,怎麼找入口函數呢??? ,其實很簡單,在mysqld進程上生成一個dump文件,然後看它的託管堆不就好啦。。。

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

台中搬家公司推薦超過30年經驗,首選台中大展搬家

從圖中可以看到,入口函數就是 mysqld!mysqld_main+0x227 中的 mysqld_main, 接下來就可以在源碼中全文檢索下。

<1> mysqld_main 入口函數 => sql/main.cc


extern int mysqld_main(int argc, char **argv);

int main(int argc, char **argv)
{
  return mysqld_main(argc, argv);
}

這裏大家可以用visualstudio打開C++源碼,使用查看定義功能,非常好用。

<2> 創建監聽


int mysqld_main(int argc, char **argv)
{
    //創建服務監聽線程
    handle_connections_sockets();
}

void handle_connections_sockets()
{
     //監聽連接
     new_sock= mysql_socket_accept(key_socket_client_connection, sock,
                                    (struct sockaddr *)(&cAddr), &length);

    if (mysql_socket_getfd(sock) == mysql_socket_getfd(unix_sock))
      thd->security_ctx->set_host((char*) my_localhost);

    //創建連接
    create_new_thread(thd);
}

//創建新線程處理處理用戶連接
static void create_new_thread(THD *thd){
   
   thd->thread_id= thd->variables.pseudo_thread_id= thread_id++;
   
   //線程進了線程調度器
   MYSQL_CALLBACK(thread_scheduler, add_connection, (thd));   
}

至此mysql就開啟了一個線程對 3306 端口進行監控,等待客戶端請求觸發 add_connection 回調。

2. 理解mysql是如何處理sql請求

這裏我以Insert操作為例稍微解剖下處理流程:

當用戶有請求sql過來之後,就會觸發 thread_scheduler的回調函數add_connection


static scheduler_functions one_thread_per_connection_scheduler_functions=
{
  0,                                     // max_threads
  NULL,                                  // init
  init_new_connection_handler_thread,    // init_new_connection_thread
  create_thread_to_handle_connection,    // add_connection
  NULL,                                  // thd_wait_begin
  NULL,                                  // thd_wait_end
  NULL,                                  // post_kill_notification
  one_thread_per_connection_end,         // end_thread
  NULL,                                  // end
};

scheduler_functions 中可以看到,add_connection 對應了 create_thread_to_handle_connection,也就是請求來了會觸發這個函數,從名字也可以看出,用一個線程處理一個用戶連接。

<1> 客戶端請求被 create_thread_to_handle_connection 接管及調用棧追蹤


void create_thread_to_handle_connection(THD *thd)
{
     if ((error= mysql_thread_create(key_thread_one_connection, &thd->real_id, &connection_attrib,
                                     handle_one_connection,(void*) thd))){}
}
//觸發回調函數  handle_one_connection
pthread_handler_t handle_one_connection(void *arg)
{
     do_handle_one_connection(thd);
}
//繼續處理
void do_handle_one_connection(THD *thd_arg){
    while (thd_is_connection_alive(thd))
    {
      mysql_audit_release(thd);
      if (do_command(thd))  break;  //這裏的 do_command 繼續處理
    }
}
//繼續分發
bool do_command(THD *thd)
{
    return_value= dispatch_command(command, thd, packet+1, (uint) (packet_length-1));
}
bool dispatch_command(enum enum_server_command command, THD *thd, char* packet, uint packet_length)
{
      switch (command) {
         case COM_INIT_DB: ....  break;
         ...
         case COM_QUERY:   //查詢語句:  insert xxxx
             mysql_parse(thd, thd->query(), thd->query_length(), &parser_state);  //sql解析
           break;
      }
}
//sql解析模塊
void mysql_parse(THD *thd, char *rawbuf, uint length, Parser_state *parser_state)
{
      error= mysql_execute_command(thd);
}

<2> 到這裏它的Parse,Optimizer,Cache都追完了,接下來看sql的CURD類型,繼續追。。。


//繼續執行
int mysql_execute_command(THD *thd)
{
  switch (lex->sql_command) 
  {
      case SQLCOM_SELECT:  res= execute_sqlcom_select(thd, all_tables);  break;

      //這個 insert 就是我要追的
      case SQLCOM_INSERT:   res= mysql_insert(thd, all_tables, lex->field_list, lex->many_values,
		                                      lex->update_list, lex->value_list,
                                              lex->duplicates, lex->ignore);
  }
}
//insert插入操作處理
bool mysql_insert(THD *thd,TABLE_LIST *table_list,List<Item> &fields, List<List_item> &values_list,
                  List<Item> &update_fields, List<Item> &update_values, 
                  enum_duplicates duplic, bool ignore)
{
      while ((values= its++))
      {
           error= write_record(thd, table, &info, &update);
      }
}
//寫入記錄
int write_record(THD *thd, TABLE *table, COPY_INFO *info, COPY_INFO *update)
{
    if (duplicate_handling == DUP_REPLACE || duplicate_handling == DUP_UPDATE)
    {
         // ha_write_row  重點是這個函數
         while ((error=table->file->ha_write_row(table->record[0])))
         {
             ....
         }
    }
}

可以看到,調用鏈還是挺深的,追到 ha_write_row 方法基本上算是追到頭了,再往下的話就是 MySql ServerStorage Engine提供的接口實現了,不信的話繼續看唄。。。

<3> 繼續挖 ha_write_row


int handler::ha_write_row(uchar *buf)
{
    MYSQL_TABLE_IO_WAIT(m_psi, PSI_TABLE_WRITE_ROW, MAX_KEY, 0,{ error= write_row(buf); })
}

//這是一個虛方法
virtual int write_row(uchar *buf __attribute__((unused)))
{
    return HA_ERR_WRONG_COMMAND;
}

看到沒有,write_row是個虛方法,也就是給底層方法實現的,在這裏就是給各大Storage Engines的哈。

3. 調用鏈圖

這麼多方法,看起來有點懵懵的吧,我來畫一張圖,幫助大家理解下這個調用堆棧。

三:總結

大家一定要熟讀架構圖,有了架構圖從源碼中找信息就方便多了,總之學習mysql成就感還是滿滿的。

如您有更多問題與我互動,掃描下方進來吧~

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

台中搬家公司費用怎麼算?

擁有20年純熟搬遷經驗,提供免費估價且流程透明更是5星評價的搬家公司

分類
發燒車訊

不到10萬SUV做出30萬的氣勢 除了眾泰 還有誰?_台中搬家

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

台中搬家公司推薦超過30年經驗,首選台中大展搬家

98-14。98萬獵豹汽車 CS10售價:9。68-14。68萬奇瑞汽車 瑞虎5售價:8。88-15。19萬總結:今天所介紹的這幾款SUV真的不差,眾泰T600與東風580都是屬於目前市場上的爆款車型,受到很多消費者的認可,瑞虎5雖然被自家的瑞虎7轉移了不少消費者的目光,但瑞虎家族長期的良好口碑使得它仍然熱度不減,最後的獵豹CS10雖然不聲不響,但銷量一直非常穩定,總體來說這幾款車型都是很值得購買的。

目前自主SUV非常火熱,近來消費者對於自主SUV支持力度也很大,

台中搬家公司費用怎麼算?

擁有20年純熟搬遷經驗,提供免費估價且流程透明更是5星評價的搬家公司

很多人都在問到底什麼車型比較值得購買,除了時下一些熱門的SUV之外,一些缺少宣傳的SUV車型無論在銷量與性價比都表現出色。接來下細看就清楚了。

東風小康 東風風光580

售價:7.29-9.99萬

眾泰汽車 T600

售價:7.98-14.98萬

獵豹汽車 CS10

售價:9.68-14.68萬

奇瑞汽車 瑞虎5

售價:8.88-15.19萬

總結:今天所介紹的這幾款SUV真的不差,眾泰T600與東風580都是屬於目前市場上的爆款車型,受到很多消費者的認可,瑞虎5雖然被自家的瑞虎7轉移了不少消費者的目光,但瑞虎家族長期的良好口碑使得它仍然熱度不減,最後的獵豹CS10雖然不聲不響,但銷量一直非常穩定,總體來說這幾款車型都是很值得購買的。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

台中搬家公司推薦超過30年經驗,首選台中大展搬家