主頁 > 資料庫 > day08-MySQL事務

day08-MySQL事務

2022-10-09 08:24:25 資料庫

MySQL事務

先來看一個例子

有一張balance表:

image-20221008163214071

需求:將tom的100塊錢轉到King賬戶中

執行的操作是:

 update balance set money = money -100 where id = 100
 update balance set money = money +100 where id = 200

這時,如果第一條陳述句執行成功,但第二條陳述句執行失敗,就會出現問題,

這里引出一個需求,將多個dml陳述句(update,insert,delete)當做一個整體,要么全部成功,要么全部失敗

--->使用事務來解決

1.什么是事務

  • 什么是事務

事務用于保證資料的一致性,它由一組相關的dml陳述句(update,insert,delete)組成,該組的dml陳述句要么全部成功,要么全部失敗,如:轉賬就要用事務來處理,用以保證資料的一致性,

  • 事務和鎖

當執行事務操作時(dml陳述句),mysql會在表上加鎖,防止其他用戶修改表的資料,這對用戶來講是非常重要的,

  • mysql資料庫控制臺事務的幾個重要操作(基本操作)
image-20221008170020052

注意:當直接回退到保存點a時,會洗掉中間的保存點b

1.start transaction --開始一個事務
2.savepoint 保存點名 -- 設定保存點
3.rollback to 保存點名 -- 回退事務
4.rollback -- 回退全部事務
5.commit -- 提交事務,所有的操作生效,不能回退

細節:

  1. 沒有設定保存點
  2. 多個保存點
  3. 存盤引擎
  4. 開始事務方式
  • 回退事務

在介紹回退事務前,先介紹一下保存點(savepoint),保存點是事務中的點,用于取消部分事務,當結束事務時(commit),會自動地洗掉該事務所定義的所有保存點,

當執行回退事務時,通過指定保存點可以回退到指定的點

  • 提交事務

使用commit陳述句可以提交事務,當執行了commit陳述句之后,會確認事務的變化、結束事務、洗掉保存點、釋放鎖,資料生效,

當使用了commit陳述句結束事務之后,其它會話[其他連接] 可以查看到事務變化后的新資料 [所有的資料正式生效]

例子

-- 事務的演示操作
-- 1.創建一張測驗表
CREATE TABLE t27(
	id INT ,
	`name` VARCHAR(32)
);

SELECT * FROM t27;
-- 2.開始事務
START TRANSACTION;

-- 3.設定保存點
SAVEPOINT a;

-- 4.執行dml操作1
INSERT INTO t27 VALUES(100,'tom');

-- 設定保存點b
SAVEPOINT b;

-- 執行dml操作2
INSERT INTO t27 VALUES(200,'jack');

-- 回退到b
ROLLBACK TO b

-- 繼續回退a
ROLLBACK TO a

-- 如果是rollback,表示直接回退到事務開始的狀態
ROLLBACK

COMMIT

2.事務注意事項

  1. 如果不開始事務,默認情況下,dml操作是自動提交的,不能回滾
  2. 如果開始一個事務,你沒有創建保存點,也可以執行rollback,默認就是回到事務開始的狀態
  3. 可以在事務中(還沒有提交時),創建多個保存點,比如:savepoint aaa;執行dml,savepoint bbb;
  4. 可以在事務沒有提交前,選擇回退到哪個保存點
  5. innodb的存盤引擎支持事務,myisam不支持
  6. 開始一個事務的方式 start transaction或者set autocommit = off;

例子

-- 討論事務細節
-- 1. 如果不開始事務,默認情況下,dml操作是自動提交的,不能回滾
INSERT INTO t27 VALUES(300,'milan'); -- 自動提交 commit
SELECT * FROM t27;

-- 2. 如果開始一個事務,你沒有創建保存點,也可以執行rollback,
-- 默認就是回到事務開始的狀態
START TRANSACTION
INSERT INTO t27 VALUES(400,'king');
INSERT INTO t27 VALUES(500,'scott');
ROLLBACK -- 表示直接回退到事務開始的狀態
COMMIT
-- 3. 可以在事務中(還沒有提交時),創建多個保存點,
-- 比如:savepoint aaa;執行dml,savepoint bbb;
-- 4. 可以在事務沒有提交前,選擇回退到哪個保存點
-- 5. innodb的存盤引擎支持事務,myisam不支持

-- 6. 開始一個事務的方式 start transaction或者set autocommit = off;
SET autocommit = off

3.事務的四種隔離級別

  • 事務隔離級別介紹
  1. 多個連接開啟各自的事務,操作資料庫中的資料時,資料庫系統要負責隔離操作,以保證各個連接在獲取資料時的準確性,
  2. 如果不考慮隔離性,可能會引發如下問題:
    • 臟讀(dirty read):當一個事務讀取另一個事務尚未提交的改變(delete,insert,update)時,產生臟讀
    • 不可重復讀(nonrepeatable read):同一個查詢在同一事務中多次進行,由于其他已提交事務所做的修改或洗掉,每次回傳不同的結果集,此時發生不可重復讀
    • 幻讀(phantom read):虛讀,同一查詢在同一事務中多次進行,由于其他已提交事務所做的插入操作,每次回傳不同的結果集,此時發生幻讀
  • 事務隔離級別

概念:MySQL隔離級別定義了事務與事務之間的隔離程度

MySQL隔離級別(4種) 臟讀 不可重復讀 幻讀 加鎖讀
讀未提交(read uncommitted) 會出現 會出現 會出現 不加鎖
讀已提交(read committed) 不會出現 會出現 會出現 不加鎖
可重復讀(repeatable read) 不會出現 不會出現 不會出現 不加鎖
可串行化(serializable) 不會出現 不會出現 不會出現 加鎖

可重復讀實際上會發生幻讀?

3.1讀未提交(read uncommitted)

MySQL的事務隔離級別--案例

我們舉例一個案例來說明mysql的事務隔離級別,以account表進行操作為例,(id、name、money)

image-20221008192142902
  1. 開啟兩個mysql的控制臺

  2. 查看當前mysql的隔離級別,均為可重復讀

    mysql> select @@tx_isolation;
    +-----------------+
    | @@tx_isolation  |
    +-----------------+
    | REPEATABLE-READ |
    +-----------------+
    1 row in set (0.00 sec)
    
    image-20221008192933956
  3. 將其中一個連接的隔離級別設定為 read uncommitted(讀未提交)

    -- 把其中一個控制臺的隔離級別設定為read uncommitted
    SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
    
    image-20221008193410009

    此時的情況:左邊的隔離級別為讀未提交;右邊的隔離級別為可重復讀

    image-20221008193559255
  4. 然后兩邊都開啟事務

    image-20221008193914876
  5. 在兩個連接控制臺中選擇資料庫,在隔離級別為 可重復讀 的連接中 創建表account

    image-20221008194826475
  6. 再在隔離級別為 可重復讀 的連接中插入一條資料(但未提交)

    image-20221008195219059

    在另一個連接(隔離級別為 讀未提交 READ-UNCOMMITTED)中查詢該表,發現可以查詢到另一事務尚未提交的插入的資料,這時就發生了臟讀

    臟讀:當一個事務讀取另一個事務尚未提交的改變(delete,insert,update)時,產生臟讀

    image-20221008195640875
  7. 在隔離級別為 可重復讀 的連接中更新一條資料,同時插入一條資料,然后提交commit

    image-20221008201529967

    此時在另一個連接(隔離級別為 讀未提交)中,查詢同一張表,可以看到在這個(隔離級別為 讀未提交的)連接中,已經可以看到另一個事務中提交的資料

    即一個事務的操作影響了另一個事務的查詢,這時候就發生了不可重復讀和幻讀

    這將會導致,當有多個連接開啟事務時,某一連接的事務的查詢會受到其他所有連接的事務的影響,這無疑將會導致混亂

    最佳情況應該是:一個連接 連接到資料庫,操作account表的時候,希望看到的資料應該是,開啟事務的這一時刻的資料

    image-20221008201046545
  8. 在連接(隔離級別為 讀未提交)中提交commit結束一個事務,此時兩個連接中的事務均已結束

3.2讀已提交(read committed)

例子

  1. 在上個例子開啟的兩個連接中,將其中一個連接的隔離級別修改為 讀已提交,

    image-20221008204600469

    另一個保持隔離級別為可重復讀

    image-20221008204315773
  2. 兩邊都開啟事務

    image-20221008204843656
  3. 在隔離級別為可重復讀的連接中插入一條資料

    image-20221008205126687

    然后在隔離級別為讀已提交的連接中 插詢表account,可以看到查詢到的資料還是本連接開啟事務時的資料

    即,讀已提交的隔離級別不會出現臟讀現象

    image-20221008205446587
  4. 在隔離級別為可重復讀的連接中更新一條資料

    image-20221008205758627

    ? 然后在隔離級別為讀已提交的連接中 插詢表account,可以看到查詢到的資料變成了其他連接的事務提交的 資料,說明,在隔離級別為讀已提交下,出現了不可重復讀和幻讀

    image-20221008205922194

3.3可重復讀(repeatable read)

  1. 重新開啟兩個連接,兩個連接的隔離級別均為可重復讀

    image-20221008211012203
  2. 然后兩邊均開啟事務

    image-20221008211323511
  3. 在一個連接中選擇資料庫,然后在account表中插入一條資料,再更新一條資料(未提交)

    image-20221008211905315

    此時該連接中的表情況為:

    image-20221008212031986

    在另一個連接中選擇資料庫,查詢表account,可以看到查詢到的表資料依舊是開啟事務時的樣子,沒有受到其他事務的影響,即沒有產生臟讀

    image-20221008212349587
  4. 在原先修改資料的連接中輸入commit提交

    image-20221008212643521

    在另一個連接中再查詢表account,可以看到資料依舊是開啟事務的時刻的樣子

    即,沒有產生不可重復讀和幻讀

    image-20221008212835739

綜上,隔離級別為可重復讀的情況下 既不會出現臟讀,也不會出現不可重復讀和幻讀

3.4可串行化(serializable)

  1. 將上面兩個連接其中一個重新啟動,將新連接設定隔離級別為可串行化(serializable)

    image-20221008214024909

    此時兩個連接的隔離級別分別為 可重復讀 和可串行化(serializable)

    image-20221008214313366
  2. 這時分別在兩個連接中均開啟事務

    image-20221008214528324
  3. 在隔離級別為可重復讀的連接中分別插入、更新資料(未提交)

    image-20221008214720377

    ? 在另一個隔離級別為可串行化的連接中選擇資料庫,然后查詢表account,回車時會發現卡住了,這是因為 可串行化會加鎖

    A連接在操作表的時候,事務還沒有結束,這時B連接也嘗試操作該表,此時將會檢查A的事務有沒有結束,如果沒有結束,B連接的操作就會進行等待,直到A連接的事務提交

    image-20221008215219456

    ? 這時,在隔離級別為可重復讀的連接中提交事務

    image-20221008215348752

    ? 可以看到可串行化級別的連接中可以成功操作表了

    ? image-20221008220238356

綜上說明,可串行化級別下,不僅不會出現臟讀、不可重復讀、幻讀,還會加鎖讀

4.設定隔離

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/511105.html

標籤:其他

上一篇:MySQL 視窗函式

下一篇:列印總數后如何讓程式自行重復?(就像一個新人在訂購)我知道我必須使用回圈但不知道如何

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more