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
  • Timer是什麼 Timer 是一種用於創建定期粒度行為的機制。 與標準的 .NET System.Threading.Timer 類相似,Orleans 的 Timer 允許在一段時間後執行特定的操作,或者在特定的時間間隔內重覆執行操作。 它在分散式系統中具有重要作用,特別是在處理需要周期性執行的 ...
  • 前言 相信很多做WPF開發的小伙伴都遇到過表格類的需求,雖然現有的Grid控制項也能實現,但是使用起來的體驗感並不好,比如要實現一個Excel中的表格效果,估計你能想到的第一個方法就是套Border控制項,用這種方法你需要控制每個Border的邊框,並且在一堆Bordr中找到Grid.Row,Grid. ...
  • .NET C#程式啟動閃退,目錄導致的問題 這是第2次踩這個坑了,很小的編程細節,容易忽略,所以寫個博客,分享給大家。 1.第一次坑:是windows 系統把程式運行成服務,找不到配置文件,原因是以服務運行它的工作目錄是在C:\Windows\System32 2.本次坑:WPF桌面程式通過註冊表設 ...
  • 在分散式系統中,數據的持久化是至關重要的一環。 Orleans 7 引入了強大的持久化功能,使得在分散式環境下管理數據變得更加輕鬆和可靠。 本文將介紹什麼是 Orleans 7 的持久化,如何設置它以及相應的代碼示例。 什麼是 Orleans 7 的持久化? Orleans 7 的持久化是指將 Or ...
  • 前言 .NET Feature Management 是一個用於管理應用程式功能的庫,它可以幫助開發人員在應用程式中輕鬆地添加、移除和管理功能。使用 Feature Management,開發人員可以根據不同用戶、環境或其他條件來動態地控制應用程式中的功能。這使得開發人員可以更靈活地管理應用程式的功 ...
  • 在 WPF 應用程式中,拖放操作是實現用戶交互的重要組成部分。通過拖放操作,用戶可以輕鬆地將數據從一個位置移動到另一個位置,或者將控制項從一個容器移動到另一個容器。然而,WPF 中預設的拖放操作可能並不是那麼好用。為瞭解決這個問題,我們可以自定義一個 Panel 來實現更簡單的拖拽操作。 自定義 Pa ...
  • 在實際使用中,由於涉及到不同編程語言之間互相調用,導致C++ 中的OpenCV與C#中的OpenCvSharp 圖像數據在不同編程語言之間難以有效傳遞。在本文中我們將結合OpenCvSharp源碼實現原理,探究兩種數據之間的通信方式。 ...
  • 一、前言 這是一篇搭建許可權管理系統的系列文章。 隨著網路的發展,信息安全對應任何企業來說都越發的重要,而本系列文章將和大家一起一步一步搭建一個全新的許可權管理系統。 說明:由於搭建一個全新的項目過於繁瑣,所有作者將挑選核心代碼和核心思路進行分享。 二、技術選擇 三、開始設計 1、自主搭建vue前端和. ...
  • Csharper中的表達式樹 這節課來瞭解一下表示式樹是什麼? 在C#中,表達式樹是一種數據結構,它可以表示一些代碼塊,如Lambda表達式或查詢表達式。表達式樹使你能夠查看和操作數據,就像你可以查看和操作代碼一樣。它們通常用於創建動態查詢和解析表達式。 一、認識表達式樹 為什麼要這樣說?它和委托有 ...
  • 在使用Django等框架來操作MySQL時,實際上底層還是通過Python來操作的,首先需要安裝一個驅動程式,在Python3中,驅動程式有多種選擇,比如有pymysql以及mysqlclient等。使用pip命令安裝mysqlclient失敗應如何解決? 安裝的python版本說明 機器同時安裝了 ...