Mysql學習之事務的隔離性

来源:https://www.cnblogs.com/gusluo/archive/2019/09/22/11299169.html
-Advertisement-
Play Games

今天咱們說說事務,相信大家都知道事務的 ACID (Atomicity、Consistency、Isolation、Durability,即原子性、一致性、隔離性、持久性)。 原子性:表示一個事務不可在分割,而且事務中的操作要麼一起成功,要麼一起失敗; 一致性:表示事務前後數據的完整性必須保持一致; ...


今天咱們說說事務,相信大家都知道事務的 ACID (Atomicity、Consistency、Isolation、Durability,即原子性、一致性、隔離性、持久性)。

原子性:表示一個事務不可在分割,而且事務中的操作要麼一起成功,要麼一起失敗;

一致性:表示事務前後數據的完整性必須保持一致;

持久性:表示事務一旦進行提交,那麼數據的就改便會永久保存,即使資料庫出現宕機也不會任何影響。

前面三個很好理解,那咱們再說說事務的隔離性,事務的隔離就是表示事務與事務之間不會相互干擾。但是多事務的情況下,還是很容易出現臟讀、不可重覆讀以及幻讀的問題。我們簡單的解釋一下這幾個詞,

臟讀:當資料庫中一個事務A正在修改一個數據但是還未提交或者回滾,另一個事務B 來讀取了修改後的內容並且使用了,之後事務A提交了,此時就引起了臟讀。
此情況僅會發生在: 讀未提交的的隔離級別.

 

不可重覆讀:在一個事務A中多次操作數據,在事務操作過程中(未最終提交),事務B也才做了處理,並且該值發生了改變,這時候就會導致A在事務操作的時候,發現數據與第一次不一樣了。 就是不可重覆讀。
此情況僅會發生在:讀未提交、讀提交的隔離級別.

 

幻讀:一個事務按相同的查詢條件重新讀取以前檢索過的數據,卻發現其他事務插入了滿足其查詢條件的新數據,這種現象就稱為幻讀。幻讀是指當事務不是獨立執行時發生的一種現象,例如第一個事務對一個表中的數據進行了修改,比如這種修改涉及到表中的“全部數據行”。同時,第二個事務也修改這個表中的數據,這種修改是向表中插入“一行新數據”。那麼,以後就會發生操作第一個事務的用戶發現表中還存在沒有修改的數據行,就好象發生了幻覺一樣.一般解決幻讀的方法是增加範圍鎖RangeS,鎖定檢索範圍為只讀,這樣就避免了幻讀。
此情況會回發生在:讀未提交、讀提交、可重覆讀的隔離級別。

 

說完上面的問題,咱們再說說事務具體的隔離級別,事務隔離級別越高效率就越低。事務隔離的級別大致分為以下幾種,

讀未提交(read uncommited)、讀提交((read commited)、可重覆讀(repeatable read)以及串列化(serializable)。那麼我來解釋一下這幾種隔離級別,

讀未提交:表示一個事務沒有提交,其他事務便能讀取到它所修改的內容;

讀提交:表示一個事務必須提交了,其他事務才能讀取到它所修改的內容;

可重覆讀:表示一個事務從開始到執行結束看到的數據與此事務開啟時看到的數據是一致的;

串列化:表示一個事務中不管是讀寫操作都會加鎖,讀會加讀鎖,寫會加寫鎖,如果多個事務出現讀寫衝突的時候,那麼必須等前一個事務執行完成,才能執行下一個事務。

可以下麵代碼查詢你當前資料庫的事務隔離級別

mysql> show variables like 'transaction_isolation';
Empty set, 1 warning (0.13 sec)

mysql 預設是為空的。你可以將啟動參數 transaction-isolation 的值設置成 READ-COMMITTED ,這裡我也建議大家把事務隔離設置成 “讀提交”。當然具體設置成什麼級別還得根據業務來。

事務隔離性的實現原理

在資料庫中會創建一個視圖,訪問的時候以試圖的邏輯結果為準。

在 “可重覆讀”  隔離級別下,這個視圖是在這個事務啟動時創建的,並且從始至終都是在用這個視圖,原因就是 “事務從開始到執行結束看到的數據與此事務開啟時看到的數據是一致的 ”;

在 “讀提交” 隔離級別下,這個視圖是在每個sql語句開始執行的時候創建的;

這裡需要註意的是 在“讀未提交” 隔離級別下,是沒有視圖概念的,因它直接取得就是最新得值;

“串列化” 隔離級別更沒有視圖得概念了,因為它直接加鎖了,這樣避免其他事務得並行訪問。

事務隔啟動方式

Mysql的事務啟動方式有以下幾種,

1、顯式的啟動事務,使用 begin 或者 start transation ,然後還有 begin 或者 start commit 事務提交,begin 或者 start rollback 事務回滾;

2、也可以設置自動提交,set autocommit=0表示設置為事務關閉自動提交,如果為 1 則表示啟動自動提交,當然自動提交事務的前提必須是要開啟事務,所以這裡就多了一步操作,使用 begin 開啟事務。如果你認為這樣很麻煩的話,你也可以執行 commit work and chain ,表示自動提交,並自動啟動下一個事務。

 

好啦,今天就說到這裡,如果有什麼問題,歡迎大家一起研究討論。


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

-Advertisement-
Play Games
更多相關文章
  • 排錯-解決MySQL非聚合列未包含在GROUP BY子句報錯問題 By:授客 QQ:1033553122 測試環境 win10 MySQL 5.7 問題描述: 執行類似以下mysql查詢, SELECT id, name, count(*) AS cnt FROM case_table GROUP ...
  • 1.查看mongodb服務是否開啟: ps -ef | grep mongod 2.管理員角色必須在啟用--auth認證參數之前創建,否則會沒有操作許可權。如果之前已經創建過用戶,請先刪除。 kill掉mongod服務,重新啟動,以noauth模式啟動: mongod --dbpath /var/lo ...
  • 1.dos命令 set names gbk; 2.MySQL練習#創建school資料庫: create database school;#切換school資料庫: use school; # primary key : 主鍵約束,不可重覆# auto_increment : 自動增長# not n ...
  • 從bson中導入ObjectId對象,將字元串轉換成id對象查詢使用: ...
  • 如何更規範化使用MySQL 背景:一個平臺或系統隨著時間的推移和用戶量的增多,資料庫操作往往會變慢;而在Java應用開發中資料庫更是尤為重要,絕大多數情況下資料庫的性能決定了程式的性能,如若前期埋下的坑越多到後期資料庫就會成為整個系統的瓶頸;因此,更規範化的使用MySQL在開發中是不可或缺的。 一、 ...
  • 一.什麼是大數據 大數據(big data)是指無法在一定時間範圍內用常規軟體工具進行捕捉、管理和處理的數據集合,是需要新處理模式才能具有更強的決策力、洞察發現力和流程優化能力的海量、高增長率和多樣化的信息資產。大數據指不用隨機分析法(抽樣調查)這樣捷徑,而採用所有數據進行分析處理。大數據的5V特點 ...
  • 概述 在開發過程中,我們經常會遇到併發問題,解決併發問題通常的方法是加鎖保護,比如常用的spinlock,mutex或者rwlock,當然也可以採用無鎖編程,對實現要求就比較高了。對於任何一個共用變數,只要有讀寫併發,就需要加鎖保護,而讀寫併發通常就會面臨一個基本問題,寫阻塞讀,或則寫優先順序比較低, ...
  • 前言 在上一篇中介紹了 "ElasticSearch集群和kinaba的安裝教程" ,本篇文章就來講解下 ElasticSearch的DSL語句使用。 ElasticSearch DSL 介紹 Elasticsearch提供了基於JSON的完整查詢DSL(特定於域的語言)來定義查詢。將查詢DSL視為 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...