紐西蘭推動「國內木材優先」政策 將創造逾3000個工作機會_潭子電動車

※超省錢租車方案

商務出差、學生出遊、旅遊渡假、臨時用車!GO 神州租賃有限公司!合法經營、合法連鎖、合法租賃小客車!

摘錄自2020年5月7日大紀元報導

來自紐西蘭全國各地的商會和林業領袖呼籲政府採取「國內木材優先(wood-first )」的政策。該政策意味著,在新冠病毒(covid-19)之後,國產和加工木材將成為公共資助的住宅、商業和公共建築的首選建築材料。預計該政策可以在全國範圍內創造數千個就業機會,並減少紐西蘭林業對國際出口的依賴。

羅托魯瓦湖理事會(Rotorua Lakes Council)五年前通過了這一決策,它是第一個通過該政策的理事會。現在,羅托魯瓦(Rotorua)、陶朗加(Tauranga)、富東灣(Eastern Bay of Plenty)、奧克蘭和其他幾個商會呼籲中央政府也通過這一決策。Deloitte的研究顯示,建築用木材產品增加25%,將為全國各地的木材加工、林業和運輸行業以及港口創造逾3000個就業崗位,以及間接的支持性就業崗位。

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

有別於一般網頁架設公司,除了模組化的架站軟體,我們的營業主軸還包含:資料庫程式開發、網站建置、網頁設計、電子商務專案開發、系統整合、APP設計建置、專業網路行銷。

 

生活環境
建築
環境經濟
農林漁牧業
循環經濟
土地利用
國際新聞
紐西蘭
林業
國產材

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

日本、大陸,發現這些先進的國家已經早就讓電動車優先上路,而且先進國家空氣品質相當好,電動車節能減碳可以減少空污

好尷尬!Samsung 官方被發現用 iPhone 發推特來宣傳 Unpacked 發表會活動_租車

※超省錢租車方案

商務出差、學生出遊、旅遊渡假、臨時用車!GO 神州租賃有限公司!合法經營、合法連鎖、合法租賃小客車!

用別牌的手機來貼文推廣另一個品牌活動,這種低級失誤雖然不是第一次發生,但之前大多都是代言人居多,沒想到已經有這麼多先例之後,最近即將舉辦 Unpacked 發表會的 Smasung,稍早美國官方 Twitter 小編又不小心犯了這個錯誤,使用 iPhone 來預告 Unpacked 發表會的內容,雖然推文很快被刪除,但已經有人把圖給擷取下來。

Samsung 官方被發現用 iPhone 發推特來宣傳 Unpacked 發表會活動

Samsung 今年重要的 Unpacked 發表會即將於今日稍晚時間登場,預計會推出 Galaxy S21 系列,也因此各國的官方 Twitter、FaceBook 粉絲團都開始醞釀,稍早 Samsung Mobile US 官方 Twitter 刊登一則「隨著 #SamsungUnpacked 越來越近,我們正努力為您帶來令人振奮的消息,您希望看到哪些創新與進步呢?」貼文時,右下角使用的裝置寫著 iPhone,不是自家 Samsung,這畫面很快就引起熱烈討論,也被人快速截圖下來:

雖然這無關大雅,但畢竟是 Samsung 官方推特帳號,推文內容又是今年重點新機的發表會,還是讓人覺得不太應該,只能說小編可能當時真的累了!不過從另一面來說,也為 Samsung 這場發表會製造出不小的話題。

這其實也不是 Samsung 第一次傳出這類新聞,不過之前都是代言人,像 2013 年網球明星 David Ferrer 就曾用 iPhone 貼文 Galaxy S4 的內容,另外還有前 T-Mobile 執行長 John Legere 用 iPhone 說他很喜歡 Note 3:

Samsung 也曾在 2 年前,起訴俄羅斯品牌大使 Ksenia Sobchak 在某次電視採訪中被發現使用 iPhone X,而不是 Samsung 手機:

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

有別於一般網頁架設公司,除了模組化的架站軟體,我們的營業主軸還包含:資料庫程式開發、網站建置、網頁設計、電子商務專案開發、系統整合、APP設計建置、專業網路行銷。

所以說,管理手機品牌的小編,在發推文時真的要多加注意,不確定美國這位 Samsung Mobile US 小編會不會受到相關懲處。

資料來源:Apple Insider

多位 Samsung Galaxy S20 FE 國外用戶反應螢幕有問題,出現奇怪現象,連外媒都碰到

您也許會喜歡:

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

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

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

日本、大陸,發現這些先進的國家已經早就讓電動車優先上路,而且先進國家空氣品質相當好,電動車節能減碳可以減少空污

小米米家螢幕掛燈在台推出:亮度色溫可調、螢幕不反光、磁吸旋轉金屬燈體、搭配 2.4GHz 無線遙控器,售價 995 元_租車

※超省錢租車方案

商務出差、學生出遊、旅遊渡假、臨時用車!GO 神州租賃有限公司!合法經營、合法連鎖、合法租賃小客車!

上個月我們才報導過小米有款相當好用的螢幕神器「米家螢幕掛燈」通過 NCC 認證,今(16)日稍早小米台灣也在官方稍早小米台灣也在官方 Facebook 粉絲專頁預告米家螢幕掛燈將和小米手錶超值版一樣於 1 月 19 日上午 10 點正式在台灣開賣囉!米家螢幕掛燈採用磁吸旋轉的金屬燈體、可調節亮度與色溫、螢幕不反光,且搭配 2.4GHz 的無線遙控器讓操作更容易,價格也是相當親民,只要 995 元。

小米米家螢幕掛燈在台推出:亮度色溫可調、螢幕不反光、磁吸旋轉金屬燈體、搭配 2.4GHz 無線遙控器,售價 995 元

米家螢幕掛燈的安裝方式相當簡單,只需顯示器上方輕輕一掛即可,完全不佔用桌面空間。燈具採用非對稱前向投光設計,並採用定制光學透鏡和光罩,可有效避免螢幕反光、讓用戶觀賞螢幕時不受到眩光困擾。

燈體材質部分,米家螢幕掛燈採用金屬材質機身,燈具部分則採用磁吸結構設計,最大調整角度為 25° 的調整範圍,能依照自身需求調整至最佳的照射角度,有效避免眩光的困擾。轉軸處部分則有 40° 可調重力轉軸,適合 1~32mm 厚度曲面螢幕、平面螢幕和擋板。

顯色指數達到 Ra90 ,可還原色彩真實細節、無可視頻閃,即便長時間使用也不易感到眼睛疲勞。

搭配 2.4GHz 無線遙控器,可透過短按、長按、旋轉等操作,調節包括色溫、亮度、使用模式、電源開關等控制。

供電方面,米家螢幕掛燈採用 USB Type-C 充電接口,能直接連接電腦、螢幕、行動電源貨 USB 充電器進行供電:

米家顯示器掛燈能支援休閒娛樂、工作、閱讀等多場景螢幕照明使用:

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

日本、大陸,發現這些先進的國家已經早就讓電動車優先上路,而且先進國家空氣品質相當好,電動車節能減碳可以減少空污

售價方面,小米米家螢幕掛燈建議售價為新台幣 995 元,將於 1 月 19 日上午 10 點起在台開賣。

圖片/消息來源:小米台灣|小米台灣 Xiaomi Taiwan(Facebook)

延伸閱讀:
小米智慧攝影機雲台版2K 在台開賣:升級 2K 高畫質和 F1.4 大光圈,售價 1,095元

小米摺疊螢幕手機工程機曝光!再次於地鐵車廂被捕獲,只是螢幕摺痕有點顯眼

您也許會喜歡:

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

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

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

有別於一般網頁架設公司,除了模組化的架站軟體,我們的營業主軸還包含:資料庫程式開發、網站建置、網頁設計、電子商務專案開發、系統整合、APP設計建置、專業網路行銷。

產品將註記碳足跡標籤 Allbirds 的超前部署永續時尚大計_租車

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

日本、大陸,發現這些先進的國家已經早就讓電動車優先上路,而且先進國家空氣品質相當好,電動車節能減碳可以減少空污

轉載自B Lab Taiwan;文:B Lab Taiwan(B型企業協會)

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

※超省錢租車方案

商務出差、學生出遊、旅遊渡假、臨時用車!GO 神州租賃有限公司!合法經營、合法連鎖、合法租賃小客車!

Sony Mobile 中階新機 Xperia 10 III 高清晰渲染圖曝光:外型與前代相似、仍將保留3.5mm耳機孔_潭子電動車

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

有別於一般網頁架設公司,除了模組化的架站軟體,我們的營業主軸還包含:資料庫程式開發、網站建置、網頁設計、電子商務專案開發、系統整合、APP設計建置、專業網路行銷。

去年五月初, Sony Mobile 在台灣推出 Xperia 10 系列中階手機 Xperia 10 II ,在稍早爆料大神 @OnLeaks 也在 Voice 分享了次世代 Xperia 10 系列新機的外觀面貌,若依照過去的命名規則新一代應會命名為 Xperia 10 III 。外觀方面, Xperia 10 III 大致上仍延續過往 Xperia 手機的設計風格,新機仍將保留 3.5mm 耳機插孔。

▲圖片來源:OnLeaks(Voice)

Sony Mobile 中階新機 Xperia 10 III 高清晰渲染圖曝光:外型與前代相似、仍將保留3.5mm耳機孔

稍早 OnLeaks(Steve Hemmerstoffer)在 Voice 分享了首批曝光的 Xperia 10 III(Xperia 10 Mark 3)外觀渲染圖,並透露 Sony Mobile 很可能在接下來幾週內發表這款新機。

根據 OnLeaks 的爆料內容, Xperia 10 III 的機身尺寸約為 154.4*68.4*8.3mm(機身厚度計算後鏡頭高度為 9.1mm),螢幕尺寸將延續前一代採用 6 吋 21:9 比例終極寬螢幕設計,雖然螢幕邊框似乎沒有明顯更窄,也未目前手機市場常見的挖孔螢幕創造更大的螢幕尺碼,但這相對保守的設計仍有許多喜愛它的族群。

▲圖片來源:OnLeaks(Voice)

音效方面,在 Xperia 10 III 預計仍保留雙前置立體聲揚聲器,延續這項設計也是可預期的決定。相機部份, Xperia 10 III 傳聞將配備三鏡頭主相機,分別為 1200 萬像素主鏡頭、800 萬像素望遠鏡頭和 800 萬像素超廣角鏡頭,前相機則搭載 800 萬像素自拍鏡頭,不過關於相機方面規格的升級尚未有更多詳細的資訊。

▲圖片來源:OnLeaks(Voice)

值得慶幸的是 Xperia 10 III 仍將保留 3.5mm 耳機插孔,對於選購中階手機的用戶來說還是相當重要的。

▲圖片來源:OnLeaks(Voice)

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

日本、大陸,發現這些先進的國家已經早就讓電動車優先上路,而且先進國家空氣品質相當好,電動車節能減碳可以減少空污

消息來源:Steve H.McFly(Twitter/@OnLeaks)|OnLeaks(Voice)

延伸閱讀:
ROG Phone 5 真機動圖曝光!機身背面加入 ROG Vision 功能副螢幕,可顯示遊戲、充電、來電通知等訊息

您也許會喜歡:

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

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

※超省錢租車方案

商務出差、學生出遊、旅遊渡假、臨時用車!GO 神州租賃有限公司!合法經營、合法連鎖、合法租賃小客車!

“造輪運動”之 ORM框架系列(二)~ 說說我心目中的ORM框架,“造輪運動”之 ORM框架系列(一)~談談我在實際業務中的增刪改查_租車

※超省錢租車方案

商務出差、學生出遊、旅遊渡假、臨時用車!GO 神州租賃有限公司!合法經營、合法連鎖、合法租賃小客車!

ORM概念解析

   首先梳理一下ORM的概念,ORM的全拼是Object Relation Mapping (對象關係映射),其中Object就是面向對象語言中的對象,本文使用的是c#語言,所以就是.net對象;Relation Mapping則是關係映射,在數據庫的系統中指的就是.net對象與數據庫表之間的關係映射。

  為什麼.net對象與數據庫表之間要進行關係映射呢?

  答案當然是顯而易見的,因為數據庫表的結構與對象的結構非常的相似,如果將兩者之間建立起映射關係,我們就可以很容易地在面向對象語言中像操作普通對象一樣去進行數據庫表的操作,那對程序員來說簡直就是福音。那麼這兩者之間的關係由誰來建立呢,畢竟不能讓它倆憑空去產生關係,當中要有“媒人”撮合,這個“媒人”就叫做ORM框架,也可以叫做數據庫持久層框架。

  在上一篇 “造輪運動”之 ORM框架系列(一)~談談我在實際業務中的增刪改查 中,談了一下我遇到的增刪改查,並分析了原生sql、Lambda to sql、存儲過程等方式的利弊,在這其中我也慢慢地形成了自己對ORM框架的認識,也逐漸繪製出了一幅我心目中完美的ORM框架藍圖。

  描繪藍圖之前先給我的ORM框架取個名字,叫做CoffeeSQL,這個名字的由來是因為我希望自己用了這個框架以後可以給我節省出工作中能享受一杯Coffee的時間~

 

 

1、實體映射

   c#的對象想要與數據庫表建立映射關係,那就要記錄映射關係的配置信息,我更喜歡採用一種一目瞭然的方式來進行配置:直接在類的字段上標識Attribute。

  基本使用方式如下代碼所示:

 1  /// <summary>
 2  /// 實體類
 3  /// </summary>
 4  [Table("T_Students")]
 5  public class Student : EntityBase
 6  {
 7      [PrimaryKey]
 8      [Column]
 9      public string Id { get; set; }
10  
11      [Column("Name")]
12      public string StudentName { get; set; }
13  
14      [Column]
15      public int Age { get; set; }
16  }

  我們可以看到在這個實體類中我們使用了三個Attribute,分別為 TableAttribute(標識映射表)、 PrimaryKeyAttribute(標識主鍵)、CloumnAttribute(標識數據列),相信這些都很好理解。

 

2、lambda操作,增刪改查,強類型

   在一些最基礎的信息增刪改查功能中,對於單表的sql操作是非常頻繁的,我建議使用lambda的形式操作,第一是因為方便,第二是因為單表操作Lambda TO SQL轉化后的sql是最簡便的,所以不用擔心它的性能。

  具體的代碼操作如下:

  1)

1  //Add
2  dbContext.Add<Student>(new Student { Id = newId, StudentName = "王二", Age = 20 });

   2)

1  //delete
2  dbContext.Delete<Student>(s => s.Id.Equals(newId));

   3)

1  //update
2  dbContext.Update<Student>(s => new { s.StudentName }, new Student { StudentName = name })  //更新字段
3           .Where(s => s.Id.Equals(newId))                                                   //where條件
4           .Done();

   4)

1  //select
2  dbContext.Queryable<Student>()
3           .Select(s => new { s.StudentName, s.Id })             //字段查詢
4           .Where(s => s.Age > 10 && s.StudentName.Equals(name)) //where條件
5           .Paging(1, 10)                                        //分頁查詢
6           .ToList();

 

3、原生sql操作,弱類型,非實體類字段的存儲的方式 => 索引器

   上面介紹的lambda表達式的操作方式只適用於單表的查詢,如果需要進行聯多表查詢或者需要進行更複雜的查詢,那麼我更傾向於進行原生sql的查詢。當然,原生sql的查詢也提供結果映射到對象的功能,類似於Dapper的用法。

  具體操作如下:

1  //原生sql查詢用法
2  string complexSQL = "select xxx from t_xxx A,t_yyy B where xx = {0} and yy = {1}";
3  object[] sqlParams = new Object[2] { DateTime.Now, 2 };
4  var resList = dbContext.Queryable(complexSQL, sqlParams).ToList<Student>();

   對上面的代碼稍微進行一下解釋,complexSQL 中的 {0}{1} 是參數化查詢參數的佔位符,在原生sql的查詢用法中你可以使用任意c#的基本變量去填充佔位符,最終獲得sql參數化查詢的效果,用法非常方便。

  當然你可能會困惑:假如我查詢的結果中包含了不是Student對象中字段的值怎麼辦?

  答案是,你可以用索引的方式將非Student對象中字段的值取出,下面做一個示範,假如你希望查出 xxx 字段,你可以這樣做:

1  Student resList1 = resList[0];
2  var segmentValue = (string)resList1["xxx"];  //查詢結果中的任何字段值都可以以索引的方式查出,記得轉換為字段的實際類型

   是不是So Easy!

 

4、更複雜的sql邏輯,那得用存儲過程

   製造生產類的企業的業務邏輯離不開流程加表單,表單的查詢與數據寫入就是屬於比較複雜的sql了。

  但是這其實還不算什麼,更複雜的是,由於現在流行的大數據概念,車間的主管們往往也想沾沾邊,所以會在車間的大屏上展現各種數據統計的看板,這其中就涉及到巨多表的查詢邏輯。曾經開發過一個看板功能,特地數了一下,單單一條sql就接近200行的代碼量,一點都不誇張。像這種邏輯很複雜的查詢,還可能涉及到依據不同條件執行不同sql的場景,我當然不會在高級語言中拼接原生sql了,因為那樣容易把自己搞暈哦。這個時候就要祭出最後的大殺技——存儲過程。

  在CoffeeSQL中你可以這樣使用存儲過程:

 1     using (ShowYouDbContext dbContext = new ShowYouDbContext())
 2     {
 3         string strsp = "xxx_storeprocedureName";
 4 
 5         OracleParameter[] paras = new OracleParameter[]
 6         {
 7             new OracleParameter("V_DATE",OracleDbType.Varchar2,50),
 8             new OracleParameter("V_SITE",OracleDbType.Varchar2,50),
 9             new OracleParameter("V_SCREEN",OracleDbType.Varchar2,50),
10             new OracleParameter("V_SHIFT",OracleDbType.Varchar2,50),
11             new OracleParameter("V_CURSOR",OracleDbType.RefCursor)
13 }; 14 15 paras[0].Value = info.date; 16 paras[1].Value = info.site; 17 paras[2].Value = info.screenKey; 18 paras[3].Value = info.shift; 19 paras[4].Direction = ParameterDirection.Output;21 22 DataSet ds = dbContext.StoredProcedureQueryable(strsp, paras).ToDataSet(); 23 24 return ds; 25 }

  這裏的用法並沒有做什麼包裝,值得一提的就是可以將查詢結果轉換為對象。當然,這是貫穿整個ORM框架的一大主要功能,無處不在。

 

5、數據庫連接管理,一主多從

  現如今大多數的數據庫都不是單一部署的,比較流行的數據庫部署方式是“一主多從”的方式,即一台數據庫作為寫入數據的數據庫(主庫),其他多台數據庫作為讀取數據的數據庫(從庫)去同步主庫的數據,從而實現了讀寫分離的功能,降低了主庫的訪問壓力,大大提高了數據庫的訪問性能。當然,我們現在所討論的這個ORM框架就理所當然地要支持這種“一主多從”的數據庫部署方式的數據庫操作。

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

有別於一般網頁架設公司,除了模組化的架站軟體,我們的營業主軸還包含:資料庫程式開發、網站建置、網頁設計、電子商務專案開發、系統整合、APP設計建置、專業網路行銷。

  具體“一主多從”的數據庫連接配置方式如下:

 1     public class ShowYouDbContext : OracleDbContext<ShowYouDbContext>
 2     {
 3         private static string writeConnStr = "xxxxxxx_1";
 4         private static string[] readConnStrs = new string[] {
 5 
 6             "xxxxxxxxx_2",
 7             "xxxxxxxxx_3",
 8             "xxxxxxxxx_4",
 9             "xxxxxxxxx_5",
10             "xxxxxxxxx_6"
11         };
12 
13         public ShowYouDbContext() : base(writeConnStr, readConnStrs)
14         {
15         }
16     }

  對DBContext類對象進行構造時將數據庫連接字符串當做構造參數傳入即可,第一條為主庫(寫數據庫)連接字符串,以後的都為從庫(讀數據庫)連接字符串。 

 

6、實體數據驗證,作為數據格式規範的防線

  實體數據驗證的概念很好理解:一個數據表中的每一個字段都有其長度、大小等限制,那麼每一個與數據表對應的實體也應當有相應的字段約束來作為數據格式規範的防線,讓持久化到數據表中的數據符合其所規定的的格式,也就相當於貨物在進入倉庫前做一個安全檢查。

  我們可以像這樣去配置一個實體類的數據驗證規則:

 1     [Table("B_DICTIONARY")]
 2     public class Dictionary : EntityCommon
 3     {
 4         [Length(1,50)]
 5         [Column]
 6         public string Name { get; set; }
 7         [Column]
 8         public string Value { get; set; }
 9         [Column]
10         public string Type { get; set; }
11     }

  這個實體類中的Name字段就標識了一個LengthAttribute標籤,規定了該字段的長度範圍為1~50,如果不符合則會拋出異常。當然,實體數據的驗證規則不止這一條,後期會根據需求再進行添加,或者用戶可以根據自己的需求進行擴展。

 

7、事務的操作形式,個人習慣,喜歡把transaction明確寫出來,不喜歡過度封裝

  事務是數據庫系統中的重要概念,事務的特性是ACID(原子性、一致性、隔離性、持久性),當然這裏不會去討論事務的概念,我要展示的是在CoffeeSql中如何使用事務:

 1     try
 2     {
 3         dbContext.DBTransaction.Begin();
 4 
 5         dbContext.Update<Machine_Match_Relation>(d => new { d.Del_Flag }, new Machine_Match_Relation { Del_Flag = 1 })
            .Where(d => d.Screen_Machine_Id.Equals(displayDeviceId)).Done(); 6 7 foreach(string bindDeviceId in bindDeviceIds) 8 { 9 dbContext.Add(new Machine_Match_Relation 10 { 11 Id = Utils.GetGuidStr(), 12 Screen_Machine_Id = displayDeviceId, 13 Machine_Id = bindDeviceId, 14 Creater = updater 15 }); 16 } 17 18 dbContext.DBTransaction.Commit(); 19 } 20 catch(Exception ex) 21 { 22 dbContext.DBTransaction.Rollback(); 23 throw ex; 24 }

  有人會說為什麼這裏不封裝一個方法,只要傳入業務操作代碼的委託Action就行了,當然可以,但是說實在的,真沒必要,如果你喜歡就自己封裝去吧。

 

8、可適配擴展多款不同的數據庫 

  作為一個能跟的上潮流的ORM,當然得具備適配多種數據庫的特性了,Oracle、Mysql、SqlServer等等數據庫,想怎麼適配就怎麼適配。

 1     //Mysql
 2     public class WQSDbContext : MysqlDbContext<WQSDbContext>
 3     {
 4         public WQSDbContext() : base(mysqlConnStr)
 5         {
 6             this.OpenQueryCache = false;
 7             this.Log = context =>
 8             {
 9                 Console.WriteLine($"sql:{context.SqlStatement}");
10                 Console.WriteLine($"time:{DateTime.Now}");
11             };
12         }
13     }
14 
15     //Oracle
16     public class WQSDbContext : OracleDbContext<WQSDbContext>
17     {
18         public WQSDbContext() : base(oracleConnStr)
19         {
20             this.OpenQueryCache = false;
21             this.Log = context =>
22             {
23                 Console.WriteLine($"sql:{context.SqlStatement}");
24                 Console.WriteLine($"time:{DateTime.Now}");
25             };
26         }
27     }

   目前CoffeeSQL實現了兩種數據庫的擴展,Oracle與Mysql。當然,如果你還想適配更多的數據庫的話,你也可以嘗試擴展,只不過我目前用到的這兩種數據庫。

 

9、緩存功能,提高性能

  還記得當初一次校招的面試,面試官問我:“你覺得ORM的速度快還是Ado.net的速度快?”

     我傻傻地脫口而出:“那當然是Ado.net更快了,相比於ORM,它少了linq語句到sql的轉換步驟,而且ORM還比直接使用Ado.net多了查詢結果映射到對象的步驟。”

  看面像和發量就知道這個面試官 心()地()善()良(,他和我對視了3秒,然後說:

  “好,今天就到這,回去等通知吧!”

   等通知的後果那也就顯而易見了……

  

  直到後來我深入地了解了ORM框架的原理才知道,那個問題並不是我回答的一句話那麼簡單,因為我忽略了ORM緩存

   CoffeeSql中也會有ORM緩存,ORM的緩存分為表緩存(二級緩存)sql語句緩存(一級緩存):表緩存一般用於數據量較小且經常會進行查詢操作的表,會將整個表的數據緩存到緩存介質中;sql語句緩存可以適用各種類型的表,它是以sql查詢語句作為緩存鍵的。

  當然,你如果並不想要知道太多其中的細節,在使用時你只需要像這樣簡單的配置:

  (ORM緩存開關)

1     public class WQSDbContext : OracleDbContext<WQSDbContext>
2     {
3         public WQSDbContext() : base(oracleConnStr)
4         {
5             this.OpenTableCache = true;
6             this.OpenQueryCache = true;
7         }
8     }

  (表緩存的實體配置)

 1     [TableCaching]
 2     [Table("B_DICTIONARY")]
 3     public class Dictionary : EntityCommon
 4     {
 5         [Column]
 6         public string Name { get; set; }
 7         [Column]
 8         public string Value { get; set; }
 9         [Column]
10         public string Type { get; set; }
11     }

   如果在實體類上標記TableCachingAttribute而且打開了表緩存,那麼就會對當前的數據表進行全表數據的緩存。

  要注意,表緩存一般只用在小數據量且查詢頻繁的表中。因為表緩存功能啟用後會事先去將全表的數據掃描然後存儲到本地緩存,直接在緩存中進行表數據的查詢操作,所以如果你將那種數據量很大且查詢並不是很頻繁的表開啟了表緩存,那你可以想象一下這個肯定會是一個得不償失的行為。

 

   以上的代碼操作是我當初對CoffeeSQL的預想,當然,現在都成為了現實。以上的內容實際上就相當於CoffeeSQL的操作手冊,因為上面的代碼完全是按照實際的CoffeeSQL的框架操作來進行展示的。

     有關於CoffeeSQL更詳細的使用細節我會在源碼的測試代碼中給出,觀眾們可以移步去看源碼:

   https://gitee.com/xiaosen123/CoffeeSqlORM

  本文為作者原創,轉載請註明出處:https://www.cnblogs.com/MaMaNongNong/p/12896757.html

 

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

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

日本、大陸,發現這些先進的國家已經早就讓電動車優先上路,而且先進國家空氣品質相當好,電動車節能減碳可以減少空污

美豬供應量超過需求 豬隻恐被安樂死_潭子電動車

※超省錢租車方案

商務出差、學生出遊、旅遊渡假、臨時用車!GO 神州租賃有限公司!合法經營、合法連鎖、合法租賃小客車!

摘錄自2020年4月21日自由時報報導

美國各地學校和餐廳因武漢肺炎疫情紛紛關閉,而這兩者可以說是豬肉的最大消費者,因此連帶地讓豬肉供應超過需求,目前每在市場上賣出一頭豬可能會賠37美元(約新台幣1112元),在這種情況下豬隻也許會被安樂死。

據《福斯新聞》報導,美國目前約有6萬名養豬戶,愛荷華州豬肉生產協會會長帕斯蒂安(Mike Paustian)指出,現在豬價如此低的原因之一,在於食品和消費者之間的聯繫受到了干擾,另一個迫在眉睫的問題是,隨著賣不出去豬越長越大,已超過了加工廠的標準。

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

有別於一般網頁架設公司,除了模組化的架站軟體,我們的營業主軸還包含:資料庫程式開發、網站建置、網頁設計、電子商務專案開發、系統整合、APP設計建置、專業網路行銷。

美國農業部(USDA)對此已宣布了武漢肺炎紓困計劃,其中包括計劃購買30億美元(約新台幣900億元)農產品和向養豬戶直接支付16億美元(約新台幣480億元)。

國際新聞
美國
家豬
安樂死
經濟動物
動物福利

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

日本、大陸,發現這些先進的國家已經早就讓電動車優先上路,而且先進國家空氣品質相當好,電動車節能減碳可以減少空污

字符串太占內存了,我想了各種奇思淫巧對它進行壓縮_潭子電動車

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

有別於一般網頁架設公司,除了模組化的架站軟體,我們的營業主軸還包含:資料庫程式開發、網站建置、網頁設計、電子商務專案開發、系統整合、APP設計建置、專業網路行銷。

一:背景

1. 講故事

在我們的一個全內存項目中,需要將一家大品牌店鋪小千萬的trade灌入到內存中,大家知道trade中一般會有訂單來源,省市區 ,當把這些字段灌進去后,你會發現他們特別侵蝕內存,因為都是字符串類型,不知道大家對內存侵蝕性是不是很清楚,我就問一個問題。

Question: 一個空字符串佔用多大內存? 你知道嗎?

思考之後,下面我們就一起驗證下,使用windbg去託管堆一查究竟,代碼如下:


        static void Main(string[] args)
        {
            string s = string.Empty;

            Console.ReadLine();
        }

0:000> !clrstack -l
OS Thread Id: 0x308c (0)
        Child SP               IP Call Site
ConsoleApp6.Program.Main(System.String[]) [C:\dream\Csharp\ConsoleApp1\ConsoleApp6\Program.cs @ 19]
    LOCALS:
        0x00000087391febd8 = 0x000002605da91420
0:000> !DumpObj /d 000002605da91420
Name:        System.String
String:      
Fields:
              MT    Field   Offset                 Type VT     Attr            Value Name
00007ff9eb2b85a0  4000281        8         System.Int32  1 instance                0 m_stringLength
00007ff9eb2b6838  4000282        c          System.Char  1 instance                0 m_firstChar
00007ff9eb2b59c0  4000286       d8        System.String  0   shared           static Empty
                                 >> Domain:Value  000002605beb2230:NotInit  <<
0:000> !objsize 000002605da91420
sizeof(000002605da91420) = 32 (0x20) bytes (System.String)

從圖中你可以看到,僅僅一個空字符串就要佔用 32byte,如果500w個空字符串就是: 32byte x 500w = 152M,是不是不算不知道,一算嚇一跳。。。 這還僅僅是一個什麼都沒有的空字符串哦。

2. 回歸到Trade

問題也已經擺出來了,接下來回歸到Trade中,為了方便演示,先模擬以文件的形式從數據庫讀取20w的trade。

    class Program
    {
        static void Main(string[] args)
        {
            var trades = Enumerable.Range(0, 20 * 10000).Select(m => new Trade()
            {
                TradeID = m,
                TradeFrom = File.ReadLines(Environment.CurrentDirectory + "//orderfrom.txt")
                                 .ElementAt(m % 4)
            }).ToList();

            GC.Collect();  //方便測試,把臨時變量清掉
            Console.WriteLine("執行成功");
            Console.ReadLine();
        }
    }

    class Trade
    {
        public int TradeID { get; set; }
        public string TradeFrom { get; set; }
    }

然後用windbg去跑一下託管堆,再量一下trades的大小。


0:000> !dumpheap -stat
Statistics:
              MT    Count    TotalSize Class Name
00007ff9eb2b59c0   200200      7010246 System.String

0:000> !objsize 0x000001a5860629a8
sizeof(000001a5860629a8) = 16097216 (0xf59fc0) bytes (System.Collections.Generic.List`1[[ConsoleApp6.Trade, ConsoleApp6]])

從上面輸出中可以看到託管堆有200200 = 20w(程序分配)+ 200(系統分配)個,然後再看size: 16097216/1024/1024= 15.35M,這就是展示的所有原始情況。

二:壓縮技巧分析

1. 使用字典化處理

其實在託管堆上有20w個字符串,但你仔細觀察一下會發現其實就是4種狀態的重複显示,要麼一淘,要麼淘寶。。。這就給了我優化機會,何不在獲取數據的時候構建好OrderFrom的字典,然後在trade中附增一個TradeFromID記錄字典中的映射值,因為特徵值少,用byte就可以了,有了這個思想,可以把代碼修改如下:

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

日本、大陸,發現這些先進的國家已經早就讓電動車優先上路,而且先進國家空氣品質相當好,電動車節能減碳可以減少空污


    class Program
    {
        public static Dictionary<int, string> orderfromDict = new Dictionary<int, string>();

        static void Main(string[] args)
        {
            var trades = Enumerable.Range(0, 20 * 10000).Select(m =>
            {
                var tradefrom = File.ReadLines(Environment.CurrentDirectory + "//orderfrom.txt")
                                 .ElementAt(m % 4);

                var kv = orderfromDict.FirstOrDefault(k => k.Value == tradefrom);

                if (kv.Key == 0)
                {
                    orderfromDict.Add(orderfromDict.Count + 1, tradefrom);
                }

                var trade = new Trade() { TradeID = m, TradeFromID = (byte)kv.Key };

                return trade;

            }).ToList();

            GC.Collect();  //方便測試,把臨時變量清掉

            Console.WriteLine("執行成功");

            Console.ReadLine();
        }
    }

    class Trade
    {
        public int TradeID { get; set; }

        public byte TradeFromID { get; set; }

        public string TradeFrom
        {
            get
            {
                return Program.orderfromDict[TradeFromID];
            }
        }
    }

代碼還是很簡單的,接下來用windbg看一下空間到底壓縮了多少?

0:000> !dumpheap -stat
Statistics:
              MT    Count    TotalSize Class Name
00007ff9eb2b59c0      204        10386 System.String

0:000> !clrstack -l
OS Thread Id: 0x2ce4 (0)
        Child SP               IP Call Site
ConsoleApp6.Program.Main(System.String[]) [C:\dream\Csharp\ConsoleApp1\ConsoleApp6\Program.cs @ 42]
    LOCALS:
        0x0000006f4d9ff078 = 0x0000016fdcf82ab8

0000006f4d9ff288 00007ff9ecd96c93 [GCFrame: 0000006f4d9ff288] 
0:000> !objsize 0x0000016fdcf82ab8
sizeof(0000016fdcf82ab8) = 6897216 (0x693e40) bytes (System.Collections.Generic.List`1[[ConsoleApp6.Trade, ConsoleApp6]])

從上面的輸出中可以看到,託管堆上string現在是:204 = 4(程序分配) + 200(系統分配)個,這4個就是字典中的4個哦,空間的話:6897216 /1024/1024= 6.57M,對應之前的 15.35M優化了將近60%。

雖然優化了60%,但這種優化是破壞性的優化,需要修改我的Trade結構,同時還要定義個Dictionary,而且還有不小幅度的修改業務邏輯,大家都知道線上的代碼是能不改則不改,不改肯定沒錯,改出問題肯定是你兜着走,是吧,那問題就來了,如何最小化的修改而且還能壓縮空間,有這樣兩全其美的事情嗎???

2. 利用字符串駐留池

貌似一說出來,大家都如夢初醒,駐留池的出現就是為了解決這個問題,CLR會在內部維護了一個我剛才定義的字典機制,重複的字符串就不需要在堆上再次分配,直接存它的引用地址即可,如果你不清楚駐留池,建議看一下我這篇: https://www.cnblogs.com/huangxincheng/p/12799736.html

接下來只需要在tradefrom 字段包一層 string.Intern 即可,改動不要太小,代碼如下:


        static void Main(string[] args)
        {
            var trades = Enumerable.Range(0, 20 * 10000).Select(m => new Trade()
            {
                TradeID = m,
                TradeFrom = string.Intern(File.ReadLines(Environment.CurrentDirectory + "//orderfrom.txt")
                                 .ElementAt(m % 4)),   //包一層 string.Intern
            }).ToList();

            GC.Collect();  //方便測試,把臨時變量清掉
            Console.WriteLine("執行成功");
            Console.ReadLine();
        }

然後用windbg抓一下託管堆。


0:000> !dumpheap -stat 
Statistics:
              MT    Count    TotalSize Class Name
00007ff9eb2b59c0      204        10386 System.String

0:000> !clrstack -l
OS Thread Id: 0x13f0 (0)
        Child SP               IP Call Site

ConsoleApp6.Program.Main(System.String[]) [C:\dream\Csharp\ConsoleApp1\ConsoleApp6\Program.cs @ 27]
    LOCALS:
        0x0000005e4d3ff0a8 = 0x000001f8a15129a8

0000005e4d3ff2b8 00007ff9ecd96c93 [GCFrame: 0000005e4d3ff2b8] 
0:000> !objsize 0x000001f8a15129a8
sizeof(000001f8a15129a8) = 8497368 (0x81a8d8) bytes (System.Collections.Generic.List`1[[ConsoleApp6.Trade, ConsoleApp6]])

觀察后發現,當用了駐留池之後空間為: 8497368 /1024/1024 =8.1M,你可能有疑問,為什麼和字典化相比內存要大24%呢? 仔細觀察你會發現,當用駐留池后,List<Trade> 中的TradeFrom存的是string在堆中的內存地址,在x64機器上要佔用8個字節,而字典化方式內存堆上Trade是不分配TradeFrom,而是用了一個byte來替代,總體來說相當於一個trade省了7byte的空間,然後用windbg看一下。


0:000> !da -length 1 -details 000001f8b16f9b68
Name:        ConsoleApp6.Trade[]
Size:        2097176(0x200018) bytes
Array:       Rank 1, Number of elements 262144, Type CLASS

    Fields:
                      MT    Field   Offset                 Type VT     Attr            Value Name
        00007ff9eb2b85a0  4000001       10             System.Int32      1     instance                    0     <TradeID>k__BackingField
        00007ff9eb2b59c0  4000002        8            System.String      0     instance     000001f8a1516030     <TradeFrom>k__BackingField

0:000> !DumpObj /d 000001f8a1516030
Name:        System.String
String:      WAP

可以看到, 000001f8a1516030 就是 堆上 string=Wap的引用地址,這個地址佔用了8byte空間。

再回頭dump一下使用字典化方式的Trade,可以看到它是沒有 <TradeFrom>k__BackingField 字段的。


0:000> !da -length 1 -details 000001ed52759ac0
Name:        ConsoleApp6.Trade[]
Size:        262168(0x40018) bytes
Array:       Rank 1, Number of elements 32768, Type CLASS
    Fields:
                      MT    Field   Offset                 Type VT     Attr            Value Name
        00007ff9eb2b85a0  4000002        8             System.Int32      1     instance                    0     <TradeID>k__BackingField
        00007ff9eb2b7d20  4000003        c              System.Byte      1     instance                    0     <TradeFromID>k__BackingField


三:總結

大家可以根據自己的情況使用,使用駐留池方式是改變最小的,簡單粗暴,自己構建字典化雖然最省內存,但需要修正業務邏輯,這個風險自擔哦。。。

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

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

※超省錢租車方案

商務出差、學生出遊、旅遊渡假、臨時用車!GO 神州租賃有限公司!合法經營、合法連鎖、合法租賃小客車!

顯卡持續缺貨,中國加密貨幣礦工現在看上 RTX 3060 遊戲筆電, 挖礦效率意外的高_潭子電動車

※超省錢租車方案

商務出差、學生出遊、旅遊渡假、臨時用車!GO 神州租賃有限公司!合法經營、合法連鎖、合法租賃小客車!

加密貨幣價格 2017 年崩盤之後,過去三年挖礦熱潮就大幅退燒,甚至還出現不少礦機被丟進垃圾場的照片。隨著去年比特幣、以太幣等加密貨幣再度大漲,AMD 與 NVIDA 桌機顯卡又開始出現短缺的情形,而且是過了半年還一樣,為此中國礦工開始將目標轉向 RTX 3000 系列遊戲筆電,最近就有人分享 RTX 3060 的挖礦測試,效率還相當不錯,看來在桌顯缺貨狀況尚未改善前,新款 RTX 3000 系列筆電搞不好也要面臨短缺現象了。

顯卡持續缺貨,中國加密貨幣礦工現在看上 RTX 3060 遊戲筆電

最近一位 JJJJKQ 中國網友於百度貼吧分享他實測 RTX 3060 Max-P 遊戲筆電的挖礦效率截圖,從數據來看,這顆晶片在挖以太幣(ETH)時效率可說相當不錯,GPU 算力為 48.99MH/s,溫度在 66 度上下。另外從配置來看,他有超頻 RTX 3060 Max-P,並不是以基礎效能下去挖礦:

GPU-Z 顯示,GPU 時脈為 1567.0MHz,記憶體時脈也來到 2125.2MHz,功耗為 104.7W:

就規格來說,RTX 3060 Max-P 行動顯示晶片跟 RTX 3060 桌顯比,TDP 雖然比較低(行動版 80W~130W、桌機 170W),不過 CUDA 核心 RTX 3060 Max-P 較多,來到 3,840 個,RTX 3060 桌顯則是 3,584 個,這也是為什麼拿來挖以太幣也能有不錯表現。

另外目前他測試的 RTX 3060 Max-P 功耗被限制在 104.7W,意味著如果提升到最高的 130W,挖礦效率應該還會更好。

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

有別於一般網頁架設公司,除了模組化的架站軟體,我們的營業主軸還包含:資料庫程式開發、網站建置、網頁設計、電子商務專案開發、系統整合、APP設計建置、專業網路行銷。

RTX 3060 預計在 2 月下旬上市,還有半個多月的時間,因此在這之前,RTX 3000 系列筆電搞不好會先被礦工們掃購,導致缺貨的狀況出現,而且這討論串的回應中也有人提到,已經有 RTX 3060 筆電開始漲價了。

話說回來,筆電還是不太適合這樣長時間高速運轉,很容易導致內部硬體過熱燒壞。

資料來源:中國百度貼吧

您也許會喜歡:

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

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

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

日本、大陸,發現這些先進的國家已經早就讓電動車優先上路,而且先進國家空氣品質相當好,電動車節能減碳可以減少空污

【大廠面試03期】MySQL是怎麼解決幻讀問題的?_租車

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

有別於一般網頁架設公司,除了模組化的架站軟體,我們的營業主軸還包含:資料庫程式開發、網站建置、網頁設計、電子商務專案開發、系統整合、APP設計建置、專業網路行銷。

問題分析

首先幻讀是什麼?

根據MySQL文檔上面的定義

The so-called phantom problem occurs within a transaction when the same query produces different sets of rows at different times. For example, if a SELECT is executed twice, but returns a row the second time that was not returned the first time, the row is a “phantom” row.

幻讀指的是在一個事務內,同一SELECT語句在不同時間執行,得到不同的結果集時,就會發生所謂的幻讀問題。

可以看看下面的例子:

這是網上找的一張圖(事務的務字寫錯了,不過不影響我們理解)

假設這個例子中的MySQL的隔離級別是提交讀,也就是一個事務內可以讀到其他事務提交后的結果。

那麼事務1第一次查詢dept表中所有部門時,結果是沒有”研發部”,但是由於隔離級別是提交讀,在事務2插入“研發部”這一行數據后,並且提交后,事務1是可以讀取到的,所以第二次查詢時,結果集中會有“研發部”。這就是幻讀。

SELECT語句分類

首先我們的SELECT查詢分為快照讀和實時讀,快照讀通過MVCC(併發多版本控制)來解決幻讀問題,實時讀通過行鎖來解決幻讀問題。

快照讀

1.1 快照讀是什麼?

因為MySQL默認的隔離級別是可重複讀,這種隔離級別下,我們普通的SELECT語句都是快照讀,也就是在一個事務內,多次執行SELECT語句,查詢到的數據都是事務開始時那個狀態的數據(這樣就不會受其他事務修改數據的影響),這樣就解決了幻讀的問題。

1.2 那麼innodb是怎麼解決快照讀的幻讀問題的?

快照讀就是每一行數據中額外保存兩個隱藏的列,插入這個數據行時的版本號,刪除這個數據行時的版本號(可能為空),滾動指針(指向undo log中用於事務回滾的日誌記錄)。

事務在對數據修改后,進行保存時,如果數據行的當前版本號與事務開始取得數據的版本號一致就保存成功,否則保存失敗。

當我們不顯式使用BEGIN來開啟事務時,我們執行的每一條語句就是一個事務,每次開始事務時,會對系統版本號+1作為當前事務的ID。

1.2.1插入操作

插入一行數據時,將事務的ID作為數據行的創建版本號。

1.2.2刪除操作

執行刪除操作時,會將原數據行的刪除版本號設置為當前事務的ID,然後根據原數據行生成一條INSERT語句,寫入undo log,用於事務執行失敗時回滾。delete操作實際上不會直接刪除,而是將delete對象打上delete flag,標記為刪除,最終的刪除操作是purge線程完成的。但是會將數據行的刪除版本號設置為當前的事務的ID,這樣後面的事務B即便查到這行數據由於事務B的ID>刪除版本號,也會忽略這條數據。

1.2.3更新操作

更新時可以簡單的認為是先將舊數據刪除,然後插入一條新數據。

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

日本、大陸,發現這些先進的國家已經早就讓電動車優先上路,而且先進國家空氣品質相當好,電動車節能減碳可以減少空污

所以執行更新操作時,其實是會將原數據行的刪除版本號設置為當前事務的ID,生成一條INSERT語句,寫入undo log,用於事務執行失敗時回滾。插入一條新的數據,將事務的ID作為數據行的的創建版本號。

1.2.4查詢操作

數據行要被查詢出來必須滿足兩個條件,

  • 數據行刪除版本號為空或者>當前事務版本號的數據(否則數據已經被標記刪除了)

  • 創建版本號<=當前事務版本號的數據(否則數據是後面的事務創建出來的)

簡單來說,就是查詢時,

  • 如果該行數據沒有被加行鎖中的X鎖(也就是沒有其他事務對這行數據進行修改),那麼直接讀取數據(前提是數據的版本號<=當前事務版本號的數據,不然不會放到查詢結果集裏面)。
  • 該行數據被加了行鎖X鎖(也就是現在有其他事務對這行數據進行修改),那麼讀數據的事務不會進行等待,而是回去undo log端裏面讀之前版本的數據(這裏存儲的數據本身是用於回滾的),在可重複讀的隔離級別下,從undo log中讀取的數據總是事務開始時的快照數據(也就是版本號小於當前事務ID的數據),在提交讀的隔離級別下,從undo log中讀取的總是最新的快照數據。

1.3 補充資料:undo log段是什麼?

undo_log是一種邏輯日誌,是舊數據的備份。有兩個作用,用於事務回滾和為MVCC提供老版本的數據。

可以認為當delete一條記錄時,undo log中會記錄一條對應的insert記錄,反之亦然,當update一條記錄時,它記錄一條對應相反的update記錄。

1.3.1.用於事務回滾

當事務執行失敗,回退時,會讀取這行數據的滾動指針(指向undo log中用於事務回滾的日誌記錄),就可以在undo log中找到相應的邏輯記錄,讀取到相應的回滾語句,執行進行回滾。

1.3.2.為MVCC提供老版本的數據

當讀取的某一行被其他事務鎖定時(也就是有其他事務正在改這行數據),它可以從undo log中分析出該行記錄以前的數據是什麼,從而提供該行版本信息,讓用戶進行快照讀。在可重複讀的隔離級別下,從undo log中讀取的數據總是事務開始時的快照數據(也就是版本號小於當前事務ID的數據),在提交讀的隔離級別下,從undo log中讀取的總是最新的快照數據(也就是比正在修改這行數據的事務ID修改前的數據。)。

實時讀

2.1實時讀是什麼?

如果說快照讀總是讀取事務開始時那個狀態的數據,實時讀就是查詢時總是執行這個查詢時數據庫中的數據。

一般使用以下這兩種查詢語句進行查詢時就是實時讀。

SELECT *** FOR UPDATE 在查詢時會先申請X鎖SELECT *** IN SHARE MODE 在查詢時會先申請S鎖

首先看一個實時讀產生幻讀的案例:

這是《MySQL技術內幕++InnoDB存儲引擎++第2版》裏面的一張圖,就是先將隔離級別設置為提交讀,這樣第一次執行 SELECT...FOR UPDATE查詢出來的數據是a:4,事務B插入了一條新的數據,再次執行 SELECT...FOR UPDATE語句時,查詢出來就是a:4,a:5兩條數據,這就是幻讀的問題。

2.1那麼innodb是怎麼解決實時讀的幻讀問題的?

如果我們不在一開始將將隔離級別設置為提交讀,其實是不會產生幻讀問題的,因為MySQL的默認隔離級別是可重複讀,在這種情況下,我們執行第一次 SELECT...FOR UPDATE查詢語句是,其實是會先申請行鎖,因為一開始數據庫就只有a:4一行數據,那麼加鎖區間其實是

(負無窮,4](4,正無窮)

我們查詢條件是a>2,上面兩個加鎖區間都會可能有數據滿足條件,所以會申請行鎖中的next-key lock,是會對上面這兩個區間都加鎖,這樣其他事務不能往這兩個區間插入數據,事務B會執行插入時會一直等待獲取鎖,直到事務A提交,釋放行鎖,事務B才有可能申請到鎖,然後進行插入。這樣就解決了幻讀問題。

如果大家對行鎖了解得比較少,下一期會對innodb中的鎖進行介紹。

最後

大家有什麼想法,可以一起討論!本文已收錄到1.1K Star數開源學習指南——《大廠面試指北》,如果想要了解更多大廠面試相關的內容,了解更多可以看
http://notfound9.github.io/interviewGuide/#/docs/BATInterview

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

※超省錢租車方案

商務出差、學生出遊、旅遊渡假、臨時用車!GO 神州租賃有限公司!合法經營、合法連鎖、合法租賃小客車!