mysql資料庫事務詳細剖析

来源:http://www.cnblogs.com/shihaibin821/archive/2017/11/17/7845470.html
-Advertisement-
Play Games

在寫之前交代一下背景吧! 做開發也好久了,沒怎麼整理過知識,現在剖析一下自己對資料庫事務的認識,以前用sqlserver,現在轉java後又用mysql、oracle。我這塊就主要解釋一下mysql資料庫事務。其實好多內容適用於各種標準資料庫! 直接就進入正文了! 不管是做啥都有理論知識,我在這塊也 ...


 

 

 

在寫之前交代一下背景吧!

做開發也好久了,沒怎麼整理過知識,現在剖析一下自己對資料庫事務的認識,以前用sqlserver,現在轉java後又用mysql、oracle。我這塊就主要解釋一下mysql資料庫事務。其實好多內容適用於各種標準資料庫!

直接就進入正文了!

不管是做啥都有理論知識,我在這塊也介紹一下。

  • 事務的特性

1.原子性(Atomicity):原子性是指事務是一個不可分割的工作單位,事務中的操作要麼都發生,要麼都不發生。 

2.一致性(Consistency):在一個事務中,事務前後數據的完整性必須保持一致,可以想象銀行轉賬、火車購票。

3.隔離性(Isolation):多個事務,事務的隔離性是指多個用戶併發訪問資料庫時, 一個用戶的事務不能被其它用戶的事務所干擾,多個併發事務之間數據要相互隔離。

4.持久性(Durability):持久性是指一個事務一旦被提交,它對資料庫中數據的改變就是永久性的,接下來即使資料庫發生故障也不應該對其有任何影響。

寫這些概念呢,是有點繞!繞就繞吧!反正也不是我規定的,這是官方的,解釋是我編的!!!

  •  事務的併發訪問問題


如果我們在不考慮隔離性問題時,事務是存在三種併發訪問問題的。

1.臟讀:在一個事務中,當讀取數據時,讀到了另一個事務未提交的數據。  

比如A賬戶給B賬戶轉了1塊錢,但是A沒有提交事務,被B賬戶通過臟讀看到了,這時,B就會以為A已經把錢轉過來了,但是這時,A賬戶回滾事務。其實錢就沒給B轉過去,但是B自己本身以為A已經轉過去了,,,有點繞,估計是我描述到繞!

看代碼:

update account set money=money+1 where name=’B’;   --此時A去通知B

update account set money=money -1 where name=’A’;

  

2.不可重覆讀:在一個事務中,兩次讀取的數據內容不一致,這是因為在查詢時,有時間間隔,數據被另一個事務已經修改提交了,那就會出現問題。

3.幻讀/虛讀:在一個事務中,兩次讀取的數據量不一致。

  • 事務的隔離級別

上面介紹了3種事務併發問題!現在介紹一下資料庫提供的解決方案!

1.read uncommitted : 讀取尚未提交的數據 :這個最低級,但是效率肯定最高,但是哪一個問題都不能解決。

2.read committed:讀取已經提交的數據 :可以解決臟讀  。

3.repeatable read:重讀讀取:可以解決臟讀 和 不可重覆讀 。

4.serializable:串列化:可以解決臟讀不可重覆讀和虛讀,效率最差,相當於鎖表,開發中一般不用。 

上面的“2”是oracle資料庫預設設置,“3”是mysql資料庫預設的設置。

下麵呢我就重點解釋一下mysql資料庫在上面各種事務隔離級別上的演示:

首先介紹兩個語法:

1.查看mysql資料庫預設的隔離級別:select @@tx_isolation

如圖:

2.設置mysql的隔離級別:set session transaction isolation level 事務的隔離級別

如圖:

  • 事務的隔離級別演示

註意:如果要自己模擬要開啟兩個mysql客戶端,也就是模擬兩個用戶!

1.read uncommitted

如圖:

我通過語法將資料庫的事務隔離級別改為了read uncommitted。

首先我有一張account表。 

如圖:視窗一

 視窗二

資料庫表原始數據money都是5000,當我啟動事務後,在zhangsan賬戶增加了1000和在李四賬戶減去了1000,但是我的事務還未提交,但是我再次查詢資料庫表時,數據已經發生變化,這就是臟讀和不可重覆讀

幻讀/虛讀我就不掩飾了,同樣存在!

2.read committed

 如圖:

我將資料庫事務隔離性改為了read committted。

        還是上面那張表:

如圖:視窗一

  

 

 

 視窗二

 

 

 

資料庫表zhangsan賬戶的money和lisi賬戶的money都發生了變化,我未提交事務,在另一個視窗事務開啟下查詢時,沒有出現臟讀,但是當我提交事務時,在另一個視窗的事務下再次查詢,出現了不可重覆讀的情況,這樣可以避免臟讀,但是查詢時已經出現不可重覆讀和幻讀/虛讀!

3.repeatable read

如圖:

我將資料庫事務隔離性改為了read committted。

        還是上面那張表:

如圖:視窗一

 視窗二

 我在兩個視窗都開啟了事務,當視窗一進行數據操作後,併進行事務提交,在視窗二的事務開啟情況下,我去查詢,沒有查詢到剛纔視窗一的數據操作記錄,這樣就避免了臟讀和不可重覆讀

 有人說也避免了虛讀/幻讀,其實沒有。

 看圖:

我在操作lisi賬戶時,數據只是發生修改的變化,但是當我修改wangwu這個賬戶時,再去查詢出現了wangwu,賬戶的數據,但是其實在我未操作前,wangwu賬戶的數據是查詢不出的。這就是幻讀/虛讀!


如果不理解幻讀/虛讀這塊,可以查一下InnoDB

4.serializable

我就不演示了,開發不建議用,效率又慢,但是所有的問題都能避免!!

總結一下 

事務隔離級別的性能:

    read uncommitted>read committed>repeatable read>serialazable

事務隔離級別的安全性:

   read uncommitted<read committed<repeatable read<serialazable

mysql 事務控制:

     開啟事務:start transaction;

     提交:commit;

     回滾:rollback;

 


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

-Advertisement-
Play Games
更多相關文章
  • #如何在main.js直接使用Vue.use()使用自己的自定義組件呢? 需要自己去定義一個test組件,在components下新建文件夾test,test下包含index.js和test.vue index.js內容如下: test.vue內容如下: 最後在main.js下導入: 在其他組件就可 ...
  • ToolBar比ActionBar更加可控,自由。因此,Google 逐漸使用ToolBar來代替ActionBar。 轉載請標明出處http://www.cnblogs.com/tangZH/p/7850572.html 使用ToolBar 1.要引入appCompat_v7支持 2.主題設置為N ...
  • 在iOS開發中,我們會經常遇到一個問題,例如,點擊一個按鈕,彈出一個遮罩層,上面顯示一個彈框,彈框顯示的位置在按鈕附近。如果這個按鈕的位置相對於屏幕邊緣的距離是固定的,那就容易了,可以直接寫死位置。可是,如果按鈕是在UITableView的cell上呢?隨著UITableView的滾動,按鈕可能在頂 ...
  • python自動安裝mysql5.7 python版本:python2.6 centos版本:centos6.9 mysql版本:mysql5.7.19 安裝目錄路徑和數據目錄路徑都是固定,當然也可以自己修改 這個腳本的原理是,通過createmycnf.sh的shell腳本生成my.cnf,buf ...
  • Redhat6.5 1、準備工作 卸載使用rpm包安裝的mysql-server、mysql軟體包 安裝自帶的ncurses-devel包 rpm -ivh /mnt/Packages/ncurses-devel-5.7-3.20090208.el6.x86_64.rpm ① 解壓cmake包 ta ...
  • 準備兩台設備,以我的為例一臺source ip:192.168.3.66和一臺duplicate ip:192.168.3.77 1》基於備份集複製資料庫,目錄結構都一樣(active database網路) 1.在duplicate端檢查有沒有亞參文件(如果沒有的話就創建) cd $ORACLE_ ...
  • 操作系統 :CentOS7.3.1611_x64 PostgreSQL版本 :9.6 問題描述 在InfluxDB中存儲時序數據時,當tag值和時間戳都相同時會執行覆蓋操作。在PostgreSQL中能不能這麼用呢? 解決方案 可以藉助唯一索引和update來實現,這裡記錄下以備後用。 1、創建帶有唯 ...
  • 本文出處:http://www.cnblogs.com/wy123/p/7851294.html 在做資料庫的異常診斷的時候,之前在SQL Server上的時候,最主要的參考信息之一就是去看當前的活動Session有哪些,這些活動Session分別在執行什麼語句,用的什麼執行方式(計劃),運行了多久 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...