mysql-innoDB-事務

来源:http://www.cnblogs.com/happyflyingpig/archive/2017/10/24/7714549.html
-Advertisement-
Play Games

事務的隔離級別: READ UNCOMMITTED(未提交讀) 在這個級別,事務中的修改,即使沒有提交,對其他事務也都是可見的,事務可以讀取未提交的數據。 READ COMMITTED(提交讀) 一個事務開始時,只能“看見”已經提交的事務所做的修改。也就是一個事務從開始知道提交前,所做的任何修改對其 ...


事務的隔離級別:

  READ UNCOMMITTED(未提交讀)

    在這個級別,事務中的修改,即使沒有提交,對其他事務也都是可見的,事務可以讀取未提交的數據。

  READ COMMITTED(提交讀)

    一個事務開始時,只能“看見”已經提交的事務所做的修改。也就是一個事務從開始知道提交前,所做的任何修改對其他事務都是不可見的

  REPEATABLE READ(可重覆讀)

    可重覆讀解決了“臟讀”的問題,但是有“幻讀”的問題,InnoDB和XtraDB存儲引擎通過MVCC解決了幻讀的問題。

  SERIALIZABLE(可串列化)

    最高的隔離級別,SERIALIZABLE會在讀取的每一行數據上都加鎖,所以可能導致大量的超時和鎖競爭的問題。

 

  1. MySQL可以通過執行SET TRANSACTION ISOLATION LEVEL命令來設置隔離級別。新的隔離級別會在下一個事務開始的時候生效。

  2. 也可以改變當前回話的隔離級別:SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;

  3. MySQL伺服器層不管理事務,事務是由下層存儲引擎實現的。

臟讀:

  允許事務B讀到了事務A未提交的數據可能就造成了臟讀,臟讀的本質就是無效的數據,只有當事務A回滾,那麼事務B讀到的數據才為臟數據,所以這裡只是可能造成臟讀。如果事務A不回滾,事務B讀到的數據就不為臟數據,也就是有效的數據。

                                                                                        

不可重覆讀:

  不可重覆讀是指在一個事務範圍中2次或者多次查詢同一數據M返回了不同的數據,例如:事務B讀取某一數據,事務A修改了該數據M並且提交,事務B又讀取該數據M(可能是再次校驗),在同一個事務B中,讀取同一個數據M的結果集不同,這個很蛋疼

                        

幻讀:

  當用戶讀取某一個範圍的數據行時,另一個事務又在該範圍內插入了新行,當用戶再讀取該範圍的數據行時,會發現會有新的“幻影行”,例如:事務B讀某一個數據M,事務A對數據M增加了一行並提交,事務B又讀數據M,發生多出了一行造成的結果不一致(如果行數相同,則是不可重覆讀)。

                        

丟失更新:

  事務A和事務B,同時獲得相同數據,然後在各自的事務中修改數據M,事務A先提交事務,數據M假如為M+,事務B後提交事務,數據M變成了M++,最終結果變成M++,覆蓋了事務A的更新。

                        

隱式鎖定和顯式鎖定:

  1.InnoDB採用的是兩階段鎖定協議(two-phase locking protocol)。在事務執行過程中,隨時都可以執行鎖定,鎖只有在執行COMMIT和ROLLBAK的時候才會釋放,並且所有的鎖是在同一時刻被釋放。

  2. LOCK TABLES和事務之間相互影響的話,情況會變得非常複雜,所以除非事務中禁用了AUTOCOMMIT,可以使用LOCK TABLES之外,其他任何時候都不要顯示的執行LOCK TABLES,不管使用的是什麼存儲引擎。

死鎖:

  兩個或多個事務在同一資源上相互占用,並請求鎖定對方占用的資源,從而導致惡性迴圈現象。當多個事務試圖以不同的順序鎖定資源時,就可能會產生死鎖。多個事務同時鎖定同一個資源也可能會產生死鎖

  例如:

--事務1
START TRANSACTION;
UPDATE price SET close=45.5 WHERE stock_id=4 AND date='2017-10-11';
UPDATE price SET close=19.8 WHERE stock_id=3 AND date='2017-10-12';
COMMIT;

--事務2
START TRANSACTION;
UPDATE price SET high=20.12 WHERE stock_id=3 AND data='2017-10-12';
UPDATE price SET high=47.20 WHERE stock_id=4 AND data='2017-10-11';
COMMIT;

 

  如果湊巧,兩個事務都執行了第一條UPDATE  語句,更新了一行數據,同時也鎖定了該行數據,接著每個事務都嘗試去執行第二條UPDATE語句,卻發現改行已經被對方鎖定,然後兩個事務都等待對方釋放鎖,同時有持有對方需要的鎖,則陷入死迴圈。除非有外部因素接入才可能接觸死鎖。InnoDB目前處理死鎖的方法時,經持有最少行級排他鎖的事務進行回滾

 

InnoDB-MVCC多版本併發控制

 

參考:

 [1] 《高性能MySQL》(第三版), Baron Schwartz等 著,寧海元等 譯,電子工業出版社 ,2013

 [2] 博客,https://segmentfault.com/a/1190000004469395#articleHeader6


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、在兩台Ubuntu機器上安裝mysql1.檢查系統中是否安裝了mysql 這個是已經安裝了的 沒有安裝的話執行上條命令 MySQL的一些簡單管理:啟動MySQL服務: sudo start mysql停止MySQL服務: sudo stop mysql修改 MySQL 的管理員密碼: sudo ...
  • 首先檢查系統裡面是否已經安裝了mysql在終端輸入 sudo netstat -tap | grep mysql 若沒有反應,沒有顯示已安裝結果,則說明沒有安裝; 如上則表示已經安裝; 安裝命令如上所示; MySQL的一些簡單管理;啟動mysql服務:sudo start mysql停止mysql服 ...
  • Linux環境: 壹、首先查看mysql的數據存放路徑:ps -ef|grep mysql 貳、進入上述查出的mysql數據存放路徑:cd var/lib/mysql (數據存放路徑) 叄、導出資料庫用mysqldump命令 1、導出數據和表結構: mysqldump -u 用戶名 -p 資料庫名 ...
  • hive-version2.1.1 DDL操作 Create/Drop/Alter/Use Database 1 //示例 2 create database if not exists testdb; 1 //示例 2 drop database testdb; 說明:restrict不跟參數為默 ...
  • django.db.utils.OperationalError: (1267, "Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '='") ...
  • 1.安裝過程沒有什麼說頭 2.下載並安裝SSMS(SQLServer Management Studio),目前已更新到2017.1 3.使用SSMS登陸資料庫 第一次選擇Windows 身份驗證,可免密碼直接登陸。 3.登陸後,創建自己的資料庫 右鍵資料庫文件夾,點擊新建資料庫。 4.作為開發測試 ...
  • 當一張表的數據非常多的時候,比如單個.myd文件都達到10G,必然讀取起來效率降低。這時就可以用mysql自帶的partition(分區功能),可以把表的數據分開在幾張表上,根據不同的區域來查詢數據以達到優化目的。mysql將會根據指定的規則,把數據放在不同的表文件上.相當於在文件上,被拆成了小塊. ...
  • JDBC 基本流程 1. 首先向項目中導入jar包 2. 創建如下代碼 3. 使用方法 載入properties配置文件 將資料庫的信息配置在properties中可以增加代碼的靈活性,修改的時候不需要去改動代碼. 可以將properties文件放在src文件夾下麵,這樣編譯完以後propertie ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...