国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【MySQL系列】MySQL的事務(wù)管理的學(xué)習(xí)(一)_ 事務(wù)概念 | 事務(wù)操作方式 | 事務(wù)隔離級別

這篇具有很好參考價值的文章主要介紹了【MySQL系列】MySQL的事務(wù)管理的學(xué)習(xí)(一)_ 事務(wù)概念 | 事務(wù)操作方式 | 事務(wù)隔離級別。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

「前言」文章內(nèi)容大致是MySQL事務(wù)管理。

「歸屬專欄」MySQL

「主頁鏈接」個人主頁

「筆者」楓葉先生(fy)

【MySQL系列】MySQL的事務(wù)管理的學(xué)習(xí)(一)_ 事務(wù)概念 | 事務(wù)操作方式 | 事務(wù)隔離級別,MySQL,mysql,學(xué)習(xí),adb

一、事務(wù)概念

事務(wù)的概念

  • MySQL事務(wù)是指一系列的數(shù)據(jù)庫操作(一組DML語句),這些操作要么全部成功執(zhí)行,要么全部失敗回滾。事務(wù)的目的是確保數(shù)據(jù)庫的一致性和完整性
  • 事務(wù)就是要做的或所做的事情,主要用于處理操作量大,復(fù)雜度高的數(shù)據(jù)。
  • 假設(shè)一個電商網(wǎng)站的訂單支付場景。在這個場景中,訂單支付涉及到多個步驟和多個數(shù)據(jù)表的操作,如訂單表、庫存表和支付記錄表等。
  • 例如,當(dāng)用戶點(diǎn)擊支付按鈕時,開始一個事務(wù),然后依次執(zhí)行創(chuàng)建訂單、扣減庫存和創(chuàng)建支付記錄的操作。如果其中任何一個操作失敗,整個事務(wù)會被回滾,訂單不會被創(chuàng)建,庫存不會被扣減,支付記錄也不會被創(chuàng)建。只有當(dāng)所有操作都成功執(zhí)行后,事務(wù)才會被提交,訂單支付完成
  • 這樣,需要多條MySQL語句構(gòu)成,那么所有這些操作合起來,就構(gòu)成了一個事務(wù)
  • 再次回憶DML:DML【data manipulation language】數(shù)據(jù)操縱語言,用來對數(shù)據(jù)進(jìn)行操作代表指令: insert,delete、update。DML中又單獨(dú)分了一個DQL,數(shù)據(jù)查詢語言,代表指令:select

MySQL同一時刻可能存在大量事務(wù),如果不對這些事務(wù)加以控制,在執(zhí)行時就可能會出現(xiàn)問題。

每條事務(wù)至少一條SQL或者很多條的SQL,這樣如果大家都訪問同樣的表數(shù)據(jù),在不加保護(hù)的情況,就絕對會出現(xiàn)問題。甚至,因?yàn)槭聞?wù)由多條SQL構(gòu)成,那么,也會存在執(zhí)行到一半出錯或者不想再執(zhí)行的情況,那么已經(jīng)執(zhí)行的怎么辦?

因此一個完整的事務(wù)并不是簡單的SQL集合,事務(wù)還需要滿足如下四個屬性:

  • 原子性:一個事務(wù)(transaction)中的所有操作,要么全部完成,要么全部不完成,不會結(jié)束在中間某個環(huán)節(jié)。事務(wù)在執(zhí)行過程中發(fā)生錯誤,會被回滾(Rollback)到事務(wù)開始前的狀態(tài),就像這個事務(wù)從來沒有執(zhí)行過一樣
  • 一致性:在事務(wù)開始之前和事務(wù)結(jié)束以后,數(shù)據(jù)庫的完整性沒有被破壞。這表示寫入的資料必須完全符合所有的預(yù)設(shè)規(guī)則,這包含資料的精確度、串聯(lián)性以及后續(xù)數(shù)據(jù)庫可以自發(fā)性地完成預(yù)定的工作
  • 隔離性:數(shù)據(jù)庫允許多個并發(fā)事務(wù)同時對其數(shù)據(jù)進(jìn)行讀寫和修改的能力,隔離性可以防止多個事務(wù)并發(fā)執(zhí)行時由于交叉執(zhí)行而導(dǎo)致數(shù)據(jù)的不一致。事務(wù)隔離分為不同級別,包括讀未提交(Read uncommitted)、讀提交(read committed)、可重復(fù)讀(repeatable read)和串行化(Serializable
  • 持久性:事務(wù)處理結(jié)束后,對數(shù)據(jù)的修改就是永久的,即便系統(tǒng)故障也不會丟失

上面的四個屬性簡稱ACID

  • 原子性(Atomicity,又稱不可分割性)
  • 一致性(Consistency
  • 隔離性(Isolation,又稱獨(dú)立性)
  • 持久性(Durability

為什么會出現(xiàn)事務(wù)

  • 事務(wù)被MySQL編寫者設(shè)計出來,本質(zhì)是為了當(dāng)應(yīng)用程序訪問數(shù)據(jù)庫的時候,事務(wù)能夠簡化我們的編程模型,不需要用戶自己去考慮各種各樣的潛在錯誤和并發(fā)問題
  • 如果MySQL只是單純的提供數(shù)據(jù)存儲服務(wù),那么用戶在訪問數(shù)據(jù)庫時就需要自行考慮各種潛在問題,包括網(wǎng)絡(luò)異常、服務(wù)器宕機(jī)等。
  • 因此事務(wù)本質(zhì)是為了應(yīng)用服務(wù)的,而不是伴隨著數(shù)據(jù)庫系統(tǒng)天生就有的,而是后面使用了數(shù)據(jù)庫一段時間之后,發(fā)現(xiàn)是需要事務(wù)這個功能的,MySQL的編寫者就對事務(wù)進(jìn)行的封裝和支持

二、事務(wù)的版本支持

在 MySQL 中只有使用了Innodb數(shù)據(jù)庫引擎的數(shù)據(jù)庫或表才支持事務(wù), MyISAM不支持

通過以下命令查看MySQL的數(shù)據(jù)庫引擎,查看哪些引擎支持事務(wù)

show engines;

【MySQL系列】MySQL的事務(wù)管理的學(xué)習(xí)(一)_ 事務(wù)概念 | 事務(wù)操作方式 | 事務(wù)隔離級別,MySQL,mysql,學(xué)習(xí),adb
說明:

  • Transactions:表示存儲引擎是否支持事務(wù),可以看到InnoDB存儲引擎支持事務(wù),而MyISAM存儲引擎不支持事務(wù)

三、事務(wù)提交方式

事務(wù)常見的提交方式有兩種,分別是自動提交和手動提交

查看事務(wù)的提交方式:

show variables like 'autocommit';

ON表示自動提交被打開,值為OFF表示自動提交被關(guān)閉,即事務(wù)的提交方式為手動提交
【MySQL系列】MySQL的事務(wù)管理的學(xué)習(xí)(一)_ 事務(wù)概念 | 事務(wù)操作方式 | 事務(wù)隔離級別,MySQL,mysql,學(xué)習(xí),adb
可以用SET來改變MySQL的自動提交模式

SET AUTOCOMMIT=0; --禁止自動提交
SET AUTOCOMMIT=1; --開啟自動提交

注:設(shè)置為0表示關(guān)閉自動提交,相當(dāng)于將事務(wù)提交方式設(shè)置為手動提交
【MySQL系列】MySQL的事務(wù)管理的學(xué)習(xí)(一)_ 事務(wù)概念 | 事務(wù)操作方式 | 事務(wù)隔離級別,MySQL,mysql,學(xué)習(xí),adb
【MySQL系列】MySQL的事務(wù)管理的學(xué)習(xí)(一)_ 事務(wù)概念 | 事務(wù)操作方式 | 事務(wù)隔離級別,MySQL,mysql,學(xué)習(xí),adb

四、事務(wù)常見的操作方式

為了便于演示,需要將MySQL的隔離級別設(shè)置成讀未提交,也就是把隔離級別設(shè)置的比較低,方便看到實(shí)驗(yàn)現(xiàn)象

隔離級有:(隔離級別依次提高,讀未提交隔離級別最低)

  1. 讀未提交(Read uncommitted
  2. 讀提交(read committed
  3. 可重復(fù)讀(repeatable read
  4. 串行化(Serializable

設(shè)置最低的隔離級別:

set global transaction isolation level read uncommitted;

【MySQL系列】MySQL的事務(wù)管理的學(xué)習(xí)(一)_ 事務(wù)概念 | 事務(wù)操作方式 | 事務(wù)隔離級別,MySQL,mysql,學(xué)習(xí),adb
注意:設(shè)置全局隔離級別后當(dāng)前會話的隔離級別不會改變,只會影響后續(xù)與MySQL新建立的連接,因此需要重啟終端才能看到會話的隔離級別被成功設(shè)置

重啟客戶端之后,再進(jìn)行登錄,查看如下:
【MySQL系列】MySQL的事務(wù)管理的學(xué)習(xí)(一)_ 事務(wù)概念 | 事務(wù)操作方式 | 事務(wù)隔離級別,MySQL,mysql,學(xué)習(xí),adb

然后創(chuàng)建測試表

create table if not exists account(
id int primary key,
name varchar(50) not null default '',
blance decimal(10,2) not null default 0.0
)ENGINE=InnoDB DEFAULT CHARSET=UTF8;

【MySQL系列】MySQL的事務(wù)管理的學(xué)習(xí)(一)_ 事務(wù)概念 | 事務(wù)操作方式 | 事務(wù)隔離級別,MySQL,mysql,學(xué)習(xí),adb

4.1 事務(wù)正常操作

測試1

啟動兩個終端,兩個終端都各啟動一個事務(wù)(右邊不啟動事務(wù)也行),啟動事務(wù)使用以下命令任意一個:

begin;
-- or
start transaction;

啟動事務(wù)之后,查詢該表是沒有數(shù)據(jù)的

:這里事務(wù)提交方式為自動提交
【MySQL系列】MySQL的事務(wù)管理的學(xué)習(xí)(一)_ 事務(wù)概念 | 事務(wù)操作方式 | 事務(wù)隔離級別,MySQL,mysql,學(xué)習(xí),adb
左終端中的事務(wù)使用savepoint命令創(chuàng)建一個保存點(diǎn),該命令用于設(shè)置一個保存點(diǎn)

savepoint 保存點(diǎn)名字;

【MySQL系列】MySQL的事務(wù)管理的學(xué)習(xí)(一)_ 事務(wù)概念 | 事務(wù)操作方式 | 事務(wù)隔離級別,MySQL,mysql,學(xué)習(xí),adb
在左終端中插入一條數(shù)據(jù),在右終端中就能查看到左終端的事務(wù)向表中插入的記錄
【MySQL系列】MySQL的事務(wù)管理的學(xué)習(xí)(一)_ 事務(wù)概念 | 事務(wù)操作方式 | 事務(wù)隔離級別,MySQL,mysql,學(xué)習(xí),adb
左終端中的事務(wù)使用savepoint命令創(chuàng)建一個保存點(diǎn),然后繼續(xù)向表中插入一條記錄,這時在右終端中也能看到新插入的這條記錄(讀未提交)
【MySQL系列】MySQL的事務(wù)管理的學(xué)習(xí)(一)_ 事務(wù)概念 | 事務(wù)操作方式 | 事務(wù)隔離級別,MySQL,mysql,學(xué)習(xí),adb
左終端中的事務(wù)使用rollback命令回滾到事務(wù)

rollback to 保存點(diǎn); -- 事務(wù)回滾到該保存點(diǎn)
rollback;          -- 默認(rèn)回滾到事務(wù)的最開始

事務(wù)回滾到保存點(diǎn)s2,這時右終端在查看表中數(shù)據(jù)時就看不到剛才插入的第二條記錄了
【MySQL系列】MySQL的事務(wù)管理的學(xué)習(xí)(一)_ 事務(wù)概念 | 事務(wù)操作方式 | 事務(wù)隔離級別,MySQL,mysql,學(xué)習(xí),adb
左終端中的事務(wù)直接使用rollback命令回滾到事務(wù)最開始,右邊的終端查詢數(shù)據(jù)為空
【MySQL系列】MySQL的事務(wù)管理的學(xué)習(xí)(一)_ 事務(wù)概念 | 事務(wù)操作方式 | 事務(wù)隔離級別,MySQL,mysql,學(xué)習(xí),adb
使用commit命令,可以提交事務(wù)(代表一個事務(wù)結(jié)束),提交事務(wù)后就不能回滾了
【MySQL系列】MySQL的事務(wù)管理的學(xué)習(xí)(一)_ 事務(wù)概念 | 事務(wù)操作方式 | 事務(wù)隔離級別,MySQL,mysql,學(xué)習(xí),adb
注意:提交事務(wù)之后就不能回滾了,再次rollback也無法回滾

上面是事務(wù)操作的正常情況,而事務(wù)更多是為了應(yīng)對非正常的情況,比如MySQL客戶端突然崩潰,不小心關(guān)閉等等

4.2 事務(wù)異常驗(yàn)證

演示1(體現(xiàn)事務(wù)的原子性)

目的:證明事務(wù)未commit,客戶端崩潰,MySQL自動會回滾(隔離級別設(shè)置為讀未提交,事務(wù)提交方式為自動提交)

兩個終端都各啟動一個事務(wù),表中事先有一條數(shù)據(jù)(右邊不啟動事務(wù)也行)
【MySQL系列】MySQL的事務(wù)管理的學(xué)習(xí)(一)_ 事務(wù)概念 | 事務(wù)操作方式 | 事務(wù)隔離級別,MySQL,mysql,學(xué)習(xí),adb
左終端中的事務(wù)向表中插入一條記錄,由于隔離級別是讀未提交,因此在右終端中能夠查詢到插入的這條記錄
【MySQL系列】MySQL的事務(wù)管理的學(xué)習(xí)(一)_ 事務(wù)概念 | 事務(wù)操作方式 | 事務(wù)隔離級別,MySQL,mysql,學(xué)習(xí),adb
左邊的客戶端異常退出ctrl + \(沒有提交事務(wù))
【MySQL系列】MySQL的事務(wù)管理的學(xué)習(xí)(一)_ 事務(wù)概念 | 事務(wù)操作方式 | 事務(wù)隔離級別,MySQL,mysql,學(xué)習(xí),adb
結(jié)果是MySQL會自動讓事務(wù)回滾到最開始,這時右終端中就看不到之前插入的記錄了
【MySQL系列】MySQL的事務(wù)管理的學(xué)習(xí)(一)_ 事務(wù)概念 | 事務(wù)操作方式 | 事務(wù)隔離級別,MySQL,mysql,學(xué)習(xí),adb

演示2(體現(xiàn)事務(wù)的持久性)

目的:證明事務(wù)commit了,即使客戶端崩潰,MySQL數(shù)據(jù)不會在受影響,數(shù)據(jù)已經(jīng)持久化(已經(jīng)保存到磁盤),(隔離級別依舊設(shè)置為讀未提交,事務(wù)提交方式為自動提交)

兩個終端都各啟動一個事務(wù)(右邊不啟動事務(wù)也行)
【MySQL系列】MySQL的事務(wù)管理的學(xué)習(xí)(一)_ 事務(wù)概念 | 事務(wù)操作方式 | 事務(wù)隔離級別,MySQL,mysql,學(xué)習(xí),adb
左終端中的事務(wù)向表中插入一條記錄,由于隔離級別是讀未提交,因此在右終端中能夠查詢到插入的這條記錄
【MySQL系列】MySQL的事務(wù)管理的學(xué)習(xí)(一)_ 事務(wù)概念 | 事務(wù)操作方式 | 事務(wù)隔離級別,MySQL,mysql,學(xué)習(xí),adb
左終端進(jìn)行提交事務(wù),然后再異常退出
【MySQL系列】MySQL的事務(wù)管理的學(xué)習(xí)(一)_ 事務(wù)概念 | 事務(wù)操作方式 | 事務(wù)隔離級別,MySQL,mysql,學(xué)習(xí),adb
右終端中仍然可以看到之前插入的記錄,因?yàn)槭聞?wù)提交后數(shù)據(jù)就被持久化了
【MySQL系列】MySQL的事務(wù)管理的學(xué)習(xí)(一)_ 事務(wù)概念 | 事務(wù)操作方式 | 事務(wù)隔離級別,MySQL,mysql,學(xué)習(xí),adb
即使是事務(wù)自動提交關(guān)閉了,只要commit了,數(shù)據(jù)依舊就被持久化了,下面實(shí)驗(yàn)3進(jìn)行驗(yàn)證

演示3(驗(yàn)證實(shí)驗(yàn))

目的:證明begin操作會自動更改提交方式,不會受MySQL是否自動提交影響

關(guān)閉自動提交

set autocommit = 0;

【MySQL系列】MySQL的事務(wù)管理的學(xué)習(xí)(一)_ 事務(wù)概念 | 事務(wù)操作方式 | 事務(wù)隔離級別,MySQL,mysql,學(xué)習(xí),adb
左終端中啟動一個事務(wù)并向表中新插入一條記錄(右邊也可以啟動一個事務(wù)),由于隔離級別是讀未提交,因此在右終端中能夠查詢到新插入的這條記錄
【MySQL系列】MySQL的事務(wù)管理的學(xué)習(xí)(一)_ 事務(wù)概念 | 事務(wù)操作方式 | 事務(wù)隔離級別,MySQL,mysql,學(xué)習(xí),adb
左終端進(jìn)行提交事務(wù),然后再異常退出,右終端中仍然可以看到之前插入的記錄,因?yàn)槭聞?wù)提交后數(shù)據(jù)就被持久化了
【MySQL系列】MySQL的事務(wù)管理的學(xué)習(xí)(一)_ 事務(wù)概念 | 事務(wù)操作方式 | 事務(wù)隔離級別,MySQL,mysql,學(xué)習(xí),adb

上述說明:使用beginstart transaction·命令啟動的事務(wù),都必須要使用commit命令手動提交,數(shù)據(jù)才會被持久化,與是否設(shè)置autocommit無關(guān)

演示4

目的:證明單條SQL與事務(wù)的關(guān)系

左右兩邊的終端都關(guān)閉自動提交,右邊不關(guān)也行(右邊不影響操作)

set autocommit = 0;

【MySQL系列】MySQL的事務(wù)管理的學(xué)習(xí)(一)_ 事務(wù)概念 | 事務(wù)操作方式 | 事務(wù)隔離級別,MySQL,mysql,學(xué)習(xí),adb
不啟動事務(wù),直接刪除一條數(shù)據(jù),由于隔離級別是讀未提交,右邊的終端也能看到結(jié)果
【MySQL系列】MySQL的事務(wù)管理的學(xué)習(xí)(一)_ 事務(wù)概念 | 事務(wù)操作方式 | 事務(wù)隔離級別,MySQL,mysql,學(xué)習(xí),adb
執(zhí)行完單條SQL語句后,左邊的客戶端直接異常退出;而右邊終端被刪除的數(shù)據(jù)被回滾回來了
【MySQL系列】MySQL的事務(wù)管理的學(xué)習(xí)(一)_ 事務(wù)概念 | 事務(wù)操作方式 | 事務(wù)隔離級別,MySQL,mysql,學(xué)習(xí),adb
左邊的終端打開自動提交,右邊不影響操作

set autocommit = 1;

【MySQL系列】MySQL的事務(wù)管理的學(xué)習(xí)(一)_ 事務(wù)概念 | 事務(wù)操作方式 | 事務(wù)隔離級別,MySQL,mysql,學(xué)習(xí),adb
不啟動事務(wù),直接刪除一條數(shù)據(jù),由于隔離級別是讀未提交,右邊的終端也能看到結(jié)果
【MySQL系列】MySQL的事務(wù)管理的學(xué)習(xí)(一)_ 事務(wù)概念 | 事務(wù)操作方式 | 事務(wù)隔離級別,MySQL,mysql,學(xué)習(xí),adb
執(zhí)行完單條SQL語句后,左邊的客戶端直接異常退出,右邊的數(shù)據(jù)沒有發(fā)生變化,即左邊終端的操作沒有被回滾
【MySQL系列】MySQL的事務(wù)管理的學(xué)習(xí)(一)_ 事務(wù)概念 | 事務(wù)操作方式 | 事務(wù)隔離級別,MySQL,mysql,學(xué)習(xí),adb
實(shí)驗(yàn)結(jié)果說明:實(shí)際我們之前一直都在使用單SQL事務(wù),只不過autocommit默認(rèn)是打開的,因此單SQL事務(wù)執(zhí)行后自動就被提交了

  • 全局變量autocommit是否被設(shè)置影響的是單條SQL語句,InnoDB中的每一條SQL都會默認(rèn)被封裝成事務(wù)
  • 如果autocommitON,則單條SQL語句執(zhí)行后會自動被提交,如果為OFF,則SQL語句執(zhí)行后需要使用commit進(jìn)行手動提交,如果不手動提交,執(zhí)行的SQL會發(fā)生回滾

上述實(shí)驗(yàn)結(jié)論

  • 只要輸入begin或者start transaction,事務(wù)便必須要通過commit提交,才會持久化,與是否設(shè)置set autocommit無關(guān)
  • 事務(wù)可以手動回滾,同時,當(dāng)操作異常,MySQL會自動回滾
  • 對于InnoDB每一條 SQL 語言都默認(rèn)封裝成事務(wù),自動提交(select有特殊情況,因?yàn)镸ySQL有 MVCC, 下面談)
  • 上述實(shí)驗(yàn)體現(xiàn)了事務(wù)本身的原子性(rollback),持久性(commit)

事務(wù)操作注意事項

  • 如果沒有設(shè)置保存點(diǎn),也可以回滾,只能回滾到事務(wù)的開始。直接使用rollback(前提是事務(wù)還沒有提交)
  • 如果一個事務(wù)被提交了(commit),則不可以回退(rollback
  • 事務(wù)可以選擇回退到哪個保存點(diǎn)(前提是事務(wù)還沒有提交)
  • InnoDB支持事務(wù),MyISAM不支持事務(wù)

五、事務(wù)隔離級別

  • MySQL服務(wù)可能會同時被多個客戶端進(jìn)程(線程)訪問,訪問的方式以事務(wù)的方式進(jìn)行
  • 一個事務(wù)可能由多條SQL語句構(gòu)成,也就意味著任何一個事務(wù),都有執(zhí)行前、執(zhí)行中和執(zhí)行后三個階段
  • 而所謂的原子性就是讓用戶層要么看到執(zhí)行前,要么看到執(zhí)行后,執(zhí)行中如果出現(xiàn)問題,可以隨時進(jìn)行回滾,所以單個事務(wù)對用戶表現(xiàn)出來的特性就是原子性
  • 但畢竟每個事務(wù)都有一個執(zhí)行的過程,在多個事務(wù)各自執(zhí)行自己的多條SQL時,仍然可能會出現(xiàn)互相影響的情況,比如多個事務(wù)同時訪問同一張表,甚至是表中的同一條記錄
  • 數(shù)據(jù)庫為了保證事務(wù)執(zhí)行過程中盡量不受干擾,于是出現(xiàn)了隔離性
  • 數(shù)據(jù)庫為了允許事務(wù)在執(zhí)行過程中受到不同程度的干擾,于是出現(xiàn)了隔離級別

隔離級別:(依次提高)

  1. 讀未提交Read Uncommitted):在該隔離級別,所有的事務(wù)都可以看到其他事務(wù)沒有提交的執(zhí)行結(jié)果(實(shí)際生產(chǎn)中不可能使用這種隔離級別的),但是相當(dāng)于沒有任何隔離性,也會有很多并發(fā)問題,如臟讀,幻讀,不可重復(fù)讀等,我們上面為了做實(shí)驗(yàn)方便,用的就是這個隔離性
  2. 讀提交Read Committed):該隔離級別是大多數(shù)數(shù)據(jù)庫的默認(rèn)的隔離級別(不是 MySQL 默
    認(rèn)的)。它滿足了隔離的簡單定義:一個事務(wù)只能看到其他的已經(jīng)提交的事務(wù)所做的改變。這種隔離級別會引起不可重復(fù)讀,即一個事務(wù)執(zhí)行時,如果多次 select,可能得到不同的結(jié)果
  3. 可重復(fù)讀Repeatable Read):這是MySQL默認(rèn)的隔離級別,它確保同一個事務(wù),在執(zhí)行中,多次讀取操作數(shù)據(jù)時,會看到同樣的數(shù)據(jù)行,但是會有幻讀問題
  4. 串行化Serializable):這是事務(wù)的最高隔離級別,它通過強(qiáng)制事務(wù)排序,使之不可能相互沖突,從而解決了幻讀的問題。它在每個讀的數(shù)據(jù)行上面加上共享鎖,但是可能會導(dǎo)致超時和鎖競爭(這種隔離級別太極端,實(shí)際生產(chǎn)基本不使用)

隔離級別基本都是通過鎖實(shí)現(xiàn)的,不同的隔離級別,鎖的使用是不同的。常見有,表鎖,行鎖,讀鎖,寫鎖,間隙鎖(GAP),Next-Key鎖(GAP+行鎖)等

5.1 查看與設(shè)置隔離性

查看全局隔級別

select @@global.tx_isolation;

【MySQL系列】MySQL的事務(wù)管理的學(xué)習(xí)(一)_ 事務(wù)概念 | 事務(wù)操作方式 | 事務(wù)隔離級別,MySQL,mysql,學(xué)習(xí),adb

查看當(dāng)前會話隔離級別

select @@session.tx_isolation;

【MySQL系列】MySQL的事務(wù)管理的學(xué)習(xí)(一)_ 事務(wù)概念 | 事務(wù)操作方式 | 事務(wù)隔離級別,MySQL,mysql,學(xué)習(xí),adb
還可以使用以下命令查看當(dāng)前會話的隔離級別

select @@tx_isolation;

【MySQL系列】MySQL的事務(wù)管理的學(xué)習(xí)(一)_ 事務(wù)概念 | 事務(wù)操作方式 | 事務(wù)隔離級別,MySQL,mysql,學(xué)習(xí),adb

設(shè)置當(dāng)前會話隔離級別

set session transaction isolation level 隔離級別;

例如,給當(dāng)前會話設(shè)置串行化

set session transaction isolation level serializable;

【MySQL系列】MySQL的事務(wù)管理的學(xué)習(xí)(一)_ 事務(wù)概念 | 事務(wù)操作方式 | 事務(wù)隔離級別,MySQL,mysql,學(xué)習(xí),adb

:設(shè)置當(dāng)前會話的隔離級別只會影響當(dāng)前會話,新起的會話依舊采用全局的隔離級

設(shè)置全局隔離級別

set global transaction isolation level 隔離級別;

比如設(shè)置全局可重復(fù)讀
【MySQL系列】MySQL的事務(wù)管理的學(xué)習(xí)(一)_ 事務(wù)概念 | 事務(wù)操作方式 | 事務(wù)隔離級別,MySQL,mysql,學(xué)習(xí),adb
注意:設(shè)置全局隔離級別會影響后續(xù)的新會話,但是不會影響當(dāng)前會話,如果需要讓全局隔離級別生效,需要重啟該客戶端
【MySQL系列】MySQL的事務(wù)管理的學(xué)習(xí)(一)_ 事務(wù)概念 | 事務(wù)操作方式 | 事務(wù)隔離級別,MySQL,mysql,學(xué)習(xí),adb
下面進(jìn)行實(shí)驗(yàn)演示,演示四個隔離級別

5.2 讀未提交(Read Uncommitted)

啟動兩個終端,將隔離級別都設(shè)置為讀未提交,然后查看表中數(shù)據(jù)

set session transaction isolation level read uncommitted;

【MySQL系列】MySQL的事務(wù)管理的學(xué)習(xí)(一)_ 事務(wù)概念 | 事務(wù)操作方式 | 事務(wù)隔離級別,MySQL,mysql,學(xué)習(xí),adb
左右兩個終端各啟動一個事務(wù),左邊終端對表中數(shù)據(jù)進(jìn)行修改,左邊終端的事務(wù)沒有提交右邊終端的事務(wù)可以看到修改的數(shù)據(jù)
【MySQL系列】MySQL的事務(wù)管理的學(xué)習(xí)(一)_ 事務(wù)概念 | 事務(wù)操作方式 | 事務(wù)隔離級別,MySQL,mysql,學(xué)習(xí),adb

說明

  • 像這種,一個事務(wù)在執(zhí)行中,讀到另一個執(zhí)行中事務(wù)的更新(或其他操作)但是未commit的數(shù)據(jù),這種現(xiàn)象叫做臟讀(dirty read)
  • 讀未提交是事務(wù)的最低隔離級別,幾乎沒有加鎖,雖然效率高,但是問題比較多,所以嚴(yán)重不建議使用

5.3 讀提交(Read Committed)

啟動兩個終端,將隔離級別都設(shè)置為讀提交,然后查看表中數(shù)據(jù)
【MySQL系列】MySQL的事務(wù)管理的學(xué)習(xí)(一)_ 事務(wù)概念 | 事務(wù)操作方式 | 事務(wù)隔離級別,MySQL,mysql,學(xué)習(xí),adb
兩個終端各自啟動一個事務(wù),左終端進(jìn)行對表中數(shù)據(jù)修改,在左終端事務(wù)未提交之前,右終端的事務(wù)看不到另一個事務(wù)的對數(shù)據(jù)的修改結(jié)果
【MySQL系列】MySQL的事務(wù)管理的學(xué)習(xí)(一)_ 事務(wù)概念 | 事務(wù)操作方式 | 事務(wù)隔離級別,MySQL,mysql,學(xué)習(xí),adb
只有當(dāng)左終端中的事務(wù)提交后,右終端中的事務(wù)才能看到修改后的數(shù)據(jù)
【MySQL系列】MySQL的事務(wù)管理的學(xué)習(xí)(一)_ 事務(wù)概念 | 事務(wù)操作方式 | 事務(wù)隔離級別,MySQL,mysql,學(xué)習(xí),adb
說明

  • 像這種,當(dāng)前事務(wù)并未commit和當(dāng)前事務(wù)提交事務(wù)這兩個時間段,另一個事務(wù)在這兩個時間段讀取到了不同的值,這種現(xiàn)象叫做不可重復(fù)讀(non reapeatable read
  • 這種現(xiàn)象可能會導(dǎo)致數(shù)據(jù)的一致性問題,因?yàn)橐粋€事務(wù)在不同的時間點(diǎn)讀取到不同的數(shù)據(jù)值,可能會產(chǎn)生錯誤的計算結(jié)果或邏輯錯誤,不建議使用該隔離級別

5.4 可重復(fù)讀(Repeatable Read)

啟動兩個終端,將隔離級別都設(shè)置為可重復(fù)讀,然后查看表中數(shù)據(jù)
【MySQL系列】MySQL的事務(wù)管理的學(xué)習(xí)(一)_ 事務(wù)概念 | 事務(wù)操作方式 | 事務(wù)隔離級別,MySQL,mysql,學(xué)習(xí),adb
兩個終端各自啟動一個事務(wù),左終端中的事務(wù)所作的修改在沒有提交之前,右終端中的事務(wù)無法看到
【MySQL系列】MySQL的事務(wù)管理的學(xué)習(xí)(一)_ 事務(wù)概念 | 事務(wù)操作方式 | 事務(wù)隔離級別,MySQL,mysql,學(xué)習(xí),adb
并且當(dāng)左終端中的事務(wù)提交后,右終端中的事務(wù)仍然看不到修改后的數(shù)據(jù)
【MySQL系列】MySQL的事務(wù)管理的學(xué)習(xí)(一)_ 事務(wù)概念 | 事務(wù)操作方式 | 事務(wù)隔離級別,MySQL,mysql,學(xué)習(xí),adb
只有當(dāng)右終端中的事務(wù)提交事務(wù)之后,再查看表中數(shù)據(jù),此時才能看到表中數(shù)據(jù)
【MySQL系列】MySQL的事務(wù)管理的學(xué)習(xí)(一)_ 事務(wù)概念 | 事務(wù)操作方式 | 事務(wù)隔離級別,MySQL,mysql,學(xué)習(xí),adb
說明

  • 向上面這樣的,稱之為可重復(fù)讀
  • 但是,一般的數(shù)據(jù)庫在可重復(fù)讀情況的時候,update數(shù)據(jù)是滿足可重復(fù)讀的,但insert數(shù)據(jù)會存在幻讀問題,因?yàn)楦綦x性是通過對數(shù)據(jù)加鎖完成的,而新插入的數(shù)據(jù)原本是不存在的,因此一般的加鎖無法屏蔽這類問題
  • 但是MySQL解決了可重復(fù)讀隔離級別下的幻讀問題(通過Next-Key鎖(GAP+行鎖)來解決幻讀問題)
  • 幻讀:一個事務(wù)在執(zhí)行過程中,相同的select語句查詢得到了不同的數(shù)據(jù)(出現(xiàn)新數(shù)據(jù)),如同出現(xiàn)了幻覺,這種現(xiàn)象叫做幻讀

下面演示MySQL的可重復(fù)讀是沒有幻讀問題

啟動兩個終端,將隔離級別都設(shè)置為可重復(fù)讀,然后查看表中數(shù)據(jù)
【MySQL系列】MySQL的事務(wù)管理的學(xué)習(xí)(一)_ 事務(wù)概念 | 事務(wù)操作方式 | 事務(wù)隔離級別,MySQL,mysql,學(xué)習(xí),adb
然后兩個終端各自啟動一個事務(wù),左終端向表中插入新數(shù)據(jù)并提交事務(wù),右終端中的事務(wù)仍然看不到新插入的數(shù)據(jù)(證明沒有幻讀問題)
【MySQL系列】MySQL的事務(wù)管理的學(xué)習(xí)(一)_ 事務(wù)概念 | 事務(wù)操作方式 | 事務(wù)隔離級別,MySQL,mysql,學(xué)習(xí),adb

5.5 串行化(Serializable)

啟動兩個終端,將隔離級別都設(shè)置為串行化,然后查看表中數(shù)據(jù)
【MySQL系列】MySQL的事務(wù)管理的學(xué)習(xí)(一)_ 事務(wù)概念 | 事務(wù)操作方式 | 事務(wù)隔離級別,MySQL,mysql,學(xué)習(xí),adb
然后兩個終端各自啟動一個事務(wù),如果這兩個事務(wù)都對表進(jìn)行的是讀操作,那么這兩個事務(wù)可以并發(fā)執(zhí)行,不會被阻塞
【MySQL系列】MySQL的事務(wù)管理的學(xué)習(xí)(一)_ 事務(wù)概念 | 事務(wù)操作方式 | 事務(wù)隔離級別,MySQL,mysql,學(xué)習(xí),adb
果這兩個事務(wù)中有一個事務(wù)要對表進(jìn)行寫操作,那么這個事務(wù)就會立即被阻塞
【MySQL系列】MySQL的事務(wù)管理的學(xué)習(xí)(一)_ 事務(wù)概念 | 事務(wù)操作方式 | 事務(wù)隔離級別,MySQL,mysql,學(xué)習(xí),adb
直到右邊終端事務(wù)提交了之后,左終端的事務(wù)才能對表進(jìn)行修改操作
【MySQL系列】MySQL的事務(wù)管理的學(xué)習(xí)(一)_ 事務(wù)概念 | 事務(wù)操作方式 | 事務(wù)隔離級別,MySQL,mysql,學(xué)習(xí),adb
說明

  • 對所有操作全部加鎖,進(jìn)行串行化,不會有問題,但是只要串行化,效率很低,幾乎完全不會被采用

5.6 隔離級別總結(jié)

  • 其中隔離級別越嚴(yán)格,安全性越高,但數(shù)據(jù)庫的并發(fā)性能也就越低,往往需要在兩者之間找一個平 衡點(diǎn)
  • mysql 默認(rèn)的隔離級別是可重復(fù)讀,一般情況下不要修改

隔離級別總結(jié)如下:
【MySQL系列】MySQL的事務(wù)管理的學(xué)習(xí)(一)_ 事務(wù)概念 | 事務(wù)操作方式 | 事務(wù)隔離級別,MySQL,mysql,學(xué)習(xí),adb

六、一致性

事務(wù)執(zhí)行的結(jié)果,必須使數(shù)據(jù)庫從一個一致性狀態(tài),變到另一個一致性狀態(tài)。當(dāng)數(shù)據(jù)庫只包含事務(wù)
成功提交的結(jié)果時,數(shù)據(jù)庫處于一致性狀態(tài)。

  • 事務(wù)在執(zhí)行過程中如果發(fā)生錯誤,則需要自動回滾到事務(wù)最開始的狀態(tài),就像這個事務(wù)從來沒有執(zhí)行過一樣,即一致性需要原子性來保證
  • 事務(wù)處理結(jié)束后,對數(shù)據(jù)的修改必須是永久的,即便系統(tǒng)故障也不能丟失,即一致性需要持久性來保證
  • 多個事務(wù)同時訪問同一份數(shù)據(jù)時,必須保證這多個事務(wù)在并發(fā)執(zhí)行時,不會因?yàn)橛捎诮徊鎴?zhí)行而導(dǎo)致數(shù)據(jù)的不一致,即一致性需要隔離性來保證
  • 其實(shí)一致性和用戶的業(yè)務(wù)邏輯強(qiáng)相關(guān),一般MySQL提供技術(shù)支持,但是一致性還是要用戶業(yè)務(wù)邏輯做支撐,也就是說一致性,是由用戶決定的
  • 在技術(shù)上,一致性需要原子性、持久性和隔離性來保證

--------------------- END ----------------------文章來源地址http://www.zghlxwxcb.cn/news/detail-703080.html

「 作者 」 楓葉先生
「 更新 」 2023.9.7
「 聲明 」 余之才疏學(xué)淺,故所撰文疏漏難免,
          或有謬誤或不準(zhǔn)確之處,敬請讀者批評指正。

到了這里,關(guān)于【MySQL系列】MySQL的事務(wù)管理的學(xué)習(xí)(一)_ 事務(wù)概念 | 事務(wù)操作方式 | 事務(wù)隔離級別的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • MySQL-----事務(wù)管理

    MySQL-----事務(wù)管理

    CURD不加控制的時候,會有什么問題呢? 上層看起來比較簡單的需求,可能對應(yīng)后端要做很多的工作,組合起來才是一個完整的需求解決方案. 一個整體,要么不做,要么做完(絕對成功,絕對失敗),不要出現(xiàn)中間操作這樣的概念 ---- 原子性!!! 上面就稱為一個 事務(wù) !!! 即 就是一個或者多個

    2024年02月05日
    瀏覽(16)
  • MySQL - 第11節(jié) - MySQL事務(wù)管理

    MySQL - 第11節(jié) - MySQL事務(wù)管理

    目錄 1.事務(wù)的概念 2.事務(wù)的版本支持 3.事務(wù)的提交方式 3.1.查看事務(wù)的提交方式 3.2.設(shè)置事務(wù)的提交方式 4.事務(wù)的相關(guān)演示 4.1.演示一:證明事務(wù)的開始與回滾 4.2.演示二:原子性 4.3.演示三:持久性 4.4.演示四:begin會自動更改提交方式 4.5.演示五:單條SQL與事務(wù)的關(guān)系 5.事務(wù)的

    2024年02月11日
    瀏覽(17)
  • 【MySQL】MySQL索引、事務(wù)、用戶管理

    【MySQL】MySQL索引、事務(wù)、用戶管理

    20歲的男生窮困潦倒,20歲的女生風(fēng)華正茂,沒有人會一直風(fēng)華正茂,也沒有人會一直窮困潦倒… 1. MySQL給用戶提供存取數(shù)據(jù)的服務(wù),但數(shù)據(jù)在linux機(jī)器的磁盤外設(shè)上進(jìn)行存儲,而磁盤的讀取效率是比較低的,MySQL如何進(jìn)行數(shù)據(jù)存取以提高效率呢?這是一個重要的話題。 在硬件

    2024年02月14日
    瀏覽(23)
  • MySQL基礎(chǔ) — 多表查詢以及事務(wù)管理

    MySQL基礎(chǔ) — 多表查詢以及事務(wù)管理

    一對一 ? 多用于單表拆分,將一張表的基礎(chǔ)字段放在一張表中,其他詳情字段放在另一張表中,以提升操作效率 ? 在任意一方加入外鍵,關(guān)聯(lián)另外一方的主鍵,并且設(shè)置外鍵為唯一的(UNIQUE) ? 因?yàn)槭且粚σ?,所以需要設(shè)置唯一約束 一對多 ? 在多的一方建立外鍵,指向一

    2024年02月07日
    瀏覽(19)
  • 【Spring全家桶系列】Spring中的事務(wù)管理(基于注解完成實(shí)現(xiàn))

    【Spring全家桶系列】Spring中的事務(wù)管理(基于注解完成實(shí)現(xiàn))

    ?? 前面的話 ?? 本文已經(jīng)收錄到《Spring框架全家桶系列》專欄,本文將介紹Spring中的事務(wù)管理,事務(wù)的概念與作用,以及Spring事務(wù)的屬性和傳播機(jī)制。 ??博客主頁:未見花聞的博客主頁 ??歡迎關(guān)注??點(diǎn)贊??收藏??留言?? ??本文由 未見花聞 原創(chuàng), CSDN 首發(fā)! ??首

    2024年02月07日
    瀏覽(19)
  • 【七天入門數(shù)據(jù)庫】第七天 MySQL的事務(wù)管理

    【七天入門數(shù)據(jù)庫】第一天 MySQL的安裝部署 【七天入門數(shù)據(jù)庫】第二天 數(shù)據(jù)庫理論基礎(chǔ) 【七天入門數(shù)據(jù)庫】第三天 MySQL的庫表操作 【七天入門數(shù)據(jù)庫】第四天 數(shù)據(jù)操作語言DML 【七天入門數(shù)據(jù)庫】第五天 MySQL的備份恢復(fù) 【七天入門數(shù)據(jù)庫】第六天 MySQL的視圖與索引 【七天

    2024年02月15日
    瀏覽(90)
  • MySQL:事務(wù)、索引、用戶管理、備份、數(shù)據(jù)庫設(shè)計(三大范式)

    MySQL:事務(wù)、索引、用戶管理、備份、數(shù)據(jù)庫設(shè)計(三大范式)

    事務(wù) (transaction):要么都成功,要么都失敗。 核心 :將一組 SQL 放在一個批次中去執(zhí)行。 原則 ACID :原子性(atomicity)、一致性(consistency)、隔離性(isolation)、持久性(durability)。 原子性 :一個事務(wù)中的所有步驟 要么都 成功, 要么都 失敗,不能只成功一個步驟。 一致性 :包括

    2023年04月26日
    瀏覽(21)
  • SSM框架學(xué)習(xí)-Spring事務(wù)管理入門

    SSM框架學(xué)習(xí)-Spring事務(wù)管理入門

    為了鞏固所學(xué)的知識,作者嘗試著開始發(fā)布一些學(xué)習(xí)筆記類的博客,方便日后回顧。當(dāng)然,如果能幫到一些萌新進(jìn)行新技術(shù)的學(xué)習(xí)那也是極好的。作者菜菜一枚,文章中如果有記錄錯誤,歡迎讀者朋友們批評指正。 (博客的參考源碼可以在我主頁的資源里找到,如果在學(xué)習(xí)的

    2024年02月05日
    瀏覽(31)
  • 4、hive的使用示例詳解-事務(wù)表、視圖、物化視圖、DDL(數(shù)據(jù)庫、表以及分區(qū))管理詳細(xì)操作

    4、hive的使用示例詳解-事務(wù)表、視圖、物化視圖、DDL(數(shù)據(jù)庫、表以及分區(qū))管理詳細(xì)操作

    1、apache-hive-3.1.2簡介及部署(三種部署方式-內(nèi)嵌模式、本地模式和遠(yuǎn)程模式)及驗(yàn)證詳解 2、hive相關(guān)概念詳解–架構(gòu)、讀寫文件機(jī)制、數(shù)據(jù)存儲 3、hive的使用示例詳解-建表、數(shù)據(jù)類型詳解、內(nèi)部外部表、分區(qū)表、分桶表 4、hive的使用示例詳解-事務(wù)表、視圖、物化視圖、DDL

    2024年02月09日
    瀏覽(26)
  • Spring 事務(wù)管理方案和事務(wù)管理器及事務(wù)控制的API

    Spring 事務(wù)管理方案和事務(wù)管理器及事務(wù)控制的API

    目錄 一、事務(wù)管理方案 1. 修改業(yè)務(wù)層代碼 2. 測試 二、事務(wù)管理器 1. 簡介 2. 在配置文件中引入約束 3. 進(jìn)行事務(wù)配置 三、事務(wù)控制的API 1.?PlatformTransactionManager接口 2.?TransactionDefinition接口 3.?TransactionStatus接口 往期專欄文章相關(guān)導(dǎo)讀? 1. Maven系列專欄文章 2. Mybatis系列專欄文

    2024年02月08日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包