国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

MySQL事務與隔離級別:解析臟讀、不可重復讀和幻讀問題

數據庫 MySQL
事務:是一組操作的集合,它是一個不可分割的工作單位,事務會把所有的操作作為一個整體一起向系統提交或撤銷操作請求,即這些操作要么同時成功,要么同時失敗。

今日目標

  • 理解事務特性
  • 理解事務隔離級別
  • 理解不同事務下出現的問題臟讀、不可重復讀和幻讀

MySQL是廣泛使用的關系型數據庫管理系統,它支持事務處理,確保數據操作的一致性和可靠性。本文將介紹MySQL事務的基本概念和重要性。

1. 事務簡介

事務:是一組操作的集合,它是一個不可分割的工作單位,事務會把所有的操作作為一個整體一起向系統提交或撤銷操作請求,即這些操作要么同時成功,要么同時失敗。

我們現在就拿一個經典的銀行存取錢例子來說明: 李四給王五轉賬500塊錢,李四銀行賬戶就要減少500,并且王五賬戶要增加500。這一組操作就必須在一個事務范圍內,要么轉賬同時成功,要么轉賬同時失敗

id

name

money

1

李四

2000

2

王五

2000

轉賬分為以下情況:

1.正常情況:轉賬成功,可以分為以下基本三步完成,完成之后李四減少500,王五增加500,轉賬成功:

圖片圖片

最終數據庫結果:

id

name

money

1

李四

1500

2

王五

2500

2.異常情況:轉賬失敗,耶斯分為三步完成,假設李四減少500塊錢以后,王五賬戶金額沒有發生變化,這就造成了嚴重的數據不一致問題。

圖片圖片

問題解決方式:通過事務完成,我們在執行業務邏輯之前開啟事務,業務執行完畢后,關閉事務。如果執行過程中出錯,則事務回滾,將數據恢復到事務開啟之前狀態。

圖片圖片

注意: 默認MySQL的事務是自動提交的,也就是說,當執行完一條DML語句時,MySQL會立即隱 式的提交事務。

如果您覺得本文不錯,歡迎關注,點贊,收藏支持,您的關注是我堅持的動力!

2. 事務操作

通過sql語句,實現剛才的例子。

2.1. 數據準備

-- 創建數據庫test
create database  if not exists test;
use test;

-- 刪除表
drop table if exists tb_account;

create table tb_account(
                           id int primary key AUTO_INCREMENT comment 'ID',
                           name varchar(10) comment '姓名',
                           money double(10,2) comment '余額'
) comment '賬戶表';
insert into tb_account(name, money) VALUES ('李四',2000), ('王五',2000);

2.2. 正常轉賬情況

-- 正常轉賬情況

-- 1. 查詢李四余額
select * from tb_account where name = '李四';
-- 2. 李四的余額減少500
update tb_account set money = money - 500 where name = '李四';
-- 3. 王五的余額增加500
update tb_account set money = money + 500 where name = '王五';

-- 4. 查看賬戶結果
select * from tb_account;

測試完畢之后檢查數據的狀態, 可以看到數據操作前后是一致的。

圖片圖片

2.3. 正常異常情況

-- 轉賬異常情況
-- 1. 查詢李四余額
select * from tb_account where name = '李四';
-- 2. 李四的余額減少500
update tb_account set money = money - 500 where name = '李四';
 出錯了....
-- 3. 王五的余額增加500
update tb_account set money = money + 500 where name = '王五';
-- 4. 查看賬戶結果
select * from tb_account;

我們把數據都恢復到2000, 然后再次一次性執行上述的SQL語句(出錯了.... 這句話不符合SQL語 法,執行就會報錯),檢查最終的數據情況, 發現數據在操作前后不一致了。

圖片圖片

2.3. 控制事務解決轉賬情況

1.開啟事務

-- 1.開啟事務
start transaction  或者 BEGIN;

2.提交事務

-- 2.提交事務
commit;

3.事務回滾

-- 3.事務回滾
rollback ;

轉賬案例

-- 開啟事務
start transaction;
-- 1. 查詢李四余額
select * from tb_account where name = '李四';
-- 2. 李四的余額減少1000
update tb_account set money = money - 500 where name = '李四';
-- 如果轉賬失敗 執行rollback
-- 3. 王五的余額增加1000
update tb_account set money = money + 500 where name = '王五';
-- 如果正常執行完畢, 則提交事務
commit;
-- 如果執行過程中報錯, 則回滾事務
-- rollback;

3. 事務四大特性

MySQL事務遵循ACID屬性,即原子性、一致性、隔離性和持久性。

  • 原子性(Atomicity):事務是不可分割的最小操作單元,事務內的所有操作要么全部成功,要么全部失敗。如果出現錯誤,所有更改都會被撤銷,數據庫保持一致狀態。
  • 一致性(Consistency):事務執行后,數據庫狀態必須滿足預定義的一致性狀態,不會導致矛盾或不一致的數據。
  • 隔離性(Isolation):隔離性控制多個事務之間的相互影響。MySQL支持不同的隔離級別,以滿足不同應用的需求。
  • 持久性(Durability):事務一旦提交或回滾,它對數據庫中的數據的改變就是永久的,即使發生系統故障也不會丟失。

4. 事務隔離級別

SQL 標準中定義了四種隔離級別,分別是:

  • 讀未提交(Read Uncommitted):這是最低的隔離級別。在該級別下,一個事務可以讀取另一個事務尚未提交的數據,可能導致臟讀(讀取到未提交數據)、不可重復讀(同一查詢多次執行結果不一致)和幻讀(查詢結果集發生變化) 等問題。這個級別的并發性最高,但數據完整性較差。
  • 讀已提交(Read Committed):在該級別下,事務只能讀取已提交的數據,避免了臟讀,但仍可能遇到不可重復讀和幻讀。這是許多數據庫系統的默認隔離級別,提供了更好的數據一致性。
  • 可重復讀(Repeatable Read):這是MySQL的默認隔離級別。在該級別下,事務在整個事務期間看到的數據保持一致,防止了臟讀和不可重復讀。但仍可能發生幻讀問題。
  • 串行化(Serializable):這是最高的隔離級別,也是最嚴格的。在該級別下,事務被強制排隊執行,以避免任何并發問題,包括臟讀、不可重復讀和幻讀。這提供了最高級別的數據一致性,但也可能降低并發性能。

5. 事務隔離級別產生并發事務問題

事務隔離級別,是為了解決多個并行事務競爭導致的數據安全問題的一種規范。具體來說,多個事務競爭可能會產生三種不同的現象。

  • 臟讀。
  • 不可重復讀
  • 幻讀接下來我們分別介紹一下:

5.1. 臟讀(Dirty Read)

臟讀:一個事務讀到另外一個事務還沒有提交的數據

圖片圖片

示例sql:

1.事務A 中SQL

-- 步驟一:設置事務A隔離級別 讀未提交

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
use test;
-- 步驟三:開啟事務A,查詢ID=1的數據
start transaction;
select * from tb_account where id=1;

-- 步驟五:開啟事務A,查詢ID=1的數據
select * from tb_account where id=1;

commit ;

2.事務B中SQL

-- 步驟二:設置事務B隔離級別 讀未提交

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
use test;
-- 步驟四:開啟事務A,
start transaction;
-- 更新ID=1的數據   mnotallow=money-500
update tb_account set mnotallow=money-500  where id=1;


commit ;

示例結果:

圖片圖片

5.2. 不可重復讀(Non-Repeatable Read)

不可重復讀:一個事務先后讀取同一條記錄,但兩次讀取的數據不同,稱之為不可重復讀

圖片圖片

示例sql:

1.事務A 中SQL

-- 讀已提交隔離級別下 不可重復讀
-- 步驟一:設置事務A隔離級別 讀已提交
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
use test;
-- 步驟三:開啟事務A,查詢ID=1的數據
start transaction;
select * from tb_account where id=1;

-- 步驟六:事務A,查詢ID=1的數據
select * from tb_account where id=1;


-- 步驟八:事務A,查詢ID=1的數據
select * from tb_account where id=1;
commit ;

2.事務B中SQL

-- 讀已提交隔離級別下 不可重復讀
-- 步驟二:設置事務B隔離級別 讀已提交
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
use test;
-- 步驟四:開啟事務B,更新ID=1的數據   mnotallow=money-500
start transaction;
update tb_account set mnotallow=money-500  where id=1;
-- 步驟五:事務B查詢id=1數據
select * from tb_account where id=1;
-- 步驟七:事務B 提交事務 并查詢結果
commit ;
select * from tb_account where id=1;

示例結果

圖片圖片

5.3. 幻讀(Phantom Read)

幻讀:一個事務按照條件查詢數據時,沒有對應的數據行,但是在插入數據時,又發現這行數據 已經存在,好像出現了 "幻影"。

圖片圖片

示例sql:

1.事務A 中SQL

-- 可重復讀隔離級別下 幻讀
-- 步驟一:設置事務A隔離級別 可重復讀
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
use test;
-- 步驟三:開啟事務A,查詢ID>1的數據
start transaction;
select * from tb_account where id>1;

-- 步驟五:事務A,查詢ID>1的數據
select * from tb_account where id>1;


-- 步驟七:事務A,查詢ID>1的數據
select * from tb_account where id>1;
commit ;

2.事務B中SQL

-- 可重復讀隔離級別下 幻讀
-- 步驟二:設置事務B隔離級別 可重復讀
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
use test;
-- 步驟四:開啟事務B,插入一條數據
start transaction;
insert into tb_account values(3,'張三',2000);
-- 步驟六:提交事務B
commit ;

示例結果

圖片圖片

總結

隔離級別

臟讀

不可重復讀

幻讀

讀未提交(Read Uncommitted)

?

?

?

讀已提交(Read Committed)

?

?

?

可重復讀(Repeatable Read)

?

?

?

串行化(Serializable)

?

?

?

查看事務隔離級別

SELECT @@TRANSACTION_ISOLATION;

設置事務隔離級別

SET [ SESSION | GLOBAL ] TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED |
READ COMMITTED | REPEATABLE READ | SERIALIZABLE }
  • SESSION:表示當前客戶端會話窗口有效
  • GLOBAL: 表示對所有客戶端會話窗口有效

注意:事務隔離級別越高,數據越安全,但是性能越低。

責任編輯:武曉燕 來源: springboot葵花寶典
相關推薦

2024-04-19 08:18:47

MySQLSQL隔離

2022-06-29 11:01:05

MySQL事務隔離級別

2022-04-27 07:32:02

臟讀幻讀不可重復讀

2023-02-02 07:06:10

2024-04-24 08:26:35

事務數據InnoDB

2019-03-21 09:06:00

數據庫復讀幻讀

2022-01-03 07:18:05

臟讀幻讀 MySQL

2024-05-13 11:46:33

MySQL數據庫

2023-10-26 00:41:46

臟讀數據幻讀

2025-02-26 10:40:44

數據庫并發幻讀

2024-07-16 08:19:46

MySQL數據InnoDB

2018-01-03 09:02:13

不可重復讀幻讀MySQL

2021-08-02 09:01:05

MySQL 多版本并發數據庫

2023-12-26 08:08:02

Spring事務MySQL

2019-12-24 14:50:01

MySQL可重復讀數據庫

2019-05-28 13:50:27

MySQL幻讀數據庫

2021-04-20 19:21:50

臟讀MySQL幻讀

2024-03-11 00:00:00

mysqlInnoDB幻讀

2022-09-21 09:00:10

MySQL幻讀隔離級別

2021-07-26 10:28:13

MySQL事務隔離
點贊
收藏

51CTO技術棧公眾號

卡一卡二国产精品| av免费看大片| 久久精品欧洲| 欧美剧在线免费观看网站| www.亚洲| 久久www免费人成看片高清| 久久久久国产精品www| 在线看片黄色| 国产精品99精品久久免费| 日韩精品欧美在线| 国产成人99久久亚洲综合精品| 麻豆国产精品va在线观看不卡| 免费网站免费进入在线| 色综合久久66| 久青草国产在线| 欧美午夜精品久久久久久浪潮| 最新黄色片网站| 亚洲欧美日韩在线| heyzo在线观看| 99精品视频在线观看| 国产在线视频综合| 国产呦萝稀缺另类资源| 国产女教师bbwbbwbbw| 国产91丝袜在线18| av天堂永久资源网| 中文字幕成人av| 午夜宅男在线视频| 一区二区三区蜜桃| 涩爱av在线播放一区二区| 狠狠躁夜夜躁人人躁婷婷91| 国产小视频免费在线观看| 欧美性猛交xxxxxx富婆| 男人在线资源站| 亚洲大胆美女视频| 久久精品超碰| 2019国产精品自在线拍国产不卡| 一区二区三区日本久久久 | 欧美性视频精品| 青青草原在线亚洲| 国产精品成人播放| 亚洲色图插插| 亚洲国产古装精品网站| 樱桃视频成人在线观看| 色婷婷av一区二区三区在线观看| 精品国产18久久久久久二百| 欧美资源在线观看| 亚洲视频在线免费| 亚洲国产精品www| 国产高清久久久| 欧美一级裸体视频| 午夜精品免费在线| 香蕉成人app免费看片| 深夜福利亚洲导航| 日韩大尺度在线观看| 国产欧美日韩综合精品二区| 韩国欧美国产一区| 九色在线91| 日韩一区二区三区在线| 精品中文字幕一区二区三区| 成人xvideos免费视频| 免费观看一级特黄欧美大片| 国产成人黄色av| 欧美国产三区| 国产日韩精品一区观看| 视频在线在亚洲| 黑人另类av| 欧美中文字幕一二三区视频| 午夜小视频在线| 中文字幕九色91在线| 色天下一区二区三区| 精品国产乱码久久久久软件| 99国产精品99久久久久久| 在线电影av| 国产一区二区三区在线观看视频 | 91免费精品视频| 精品一区二区精品| 毛片中文在线观看| 日韩第一页在线| 国内黄色精品| 日本老太婆做爰视频| 亚洲一区在线免费观看| 在线手机中文字幕| 国产精品美腿一区在线看| 精品在线亚洲视频| 在线观看国产v片| 中文字幕精品一区二区精品| 国产一区日韩一区| 天堂在线亚洲| 日韩毛片中文字幕| 伊人青青综合网| 日韩av片在线看| 91精品午夜视频| 免费成人av| 97超碰青青草| 精品日韩成人av| 婷婷丁香综合| 中文字幕第88页| 精品视频中文字幕| 欧美特黄一级| 在线观看国产视频一二三| 日韩亚洲综合在线| 丝袜美腿亚洲一区二区图片| 在线观看h网址| 2019亚洲日韩新视频| 成人免费看黄yyy456| 中中文字幕av在线| 91久久久一线二线三线品牌| 亚洲色图一区二区三区| 欧美日韩破处视频| 日本精品福利视频| 欧美mv日韩mv亚洲| 国产欧美综合一区二区三区| 亚洲永久精品免费| 97久久精品在线| 久久日一线二线三线suv| 亚洲欧洲高清| 亚洲国产精品久久久久婷婷老年| 欧美在线短视频| 久久精品播放| 国产网站观看9久| 欧美精品国产精品日韩精品| 成人av在线网站| 福利一区二区| 久久这里只有精品8| 亚洲天堂第二页| 另类中文字幕网| 乱人伦视频在线| 公共露出暴露狂另类av| 日韩av影院在线观看| 免费av成人在线| 日韩脚交footjobhd| 欧美日本亚洲| 欧美一级电影网站| 久久综合五月| 麻豆mv在线观看| 天堂av在线中文| 日韩在线视频免费观看高清中文| 99精品久久免费看蜜臀剧情介绍| 视频91a欧美| 爱情岛论坛vip永久入口| 1769国产精品| 欧美性猛交xxxx富婆| 亚洲高清电影| heyzo中文字幕在线| 国产高清www| 欧美成人国产va精品日本一级| 国产精品视频你懂的| 青青草91久久久久久久久| 青青国产在线| 日韩福利视频| 中文字幕不卡在线视频极品| 亚洲国产成人私人影院tom| 精品视频网站| 欧美精品hd| 日本一本中文字幕| 欧美亚洲另类在线| 91成人在线精品| 美女视频黄 久久| 国产精品一区二区免费福利视频| 天堂一区在线观看| 91丝袜脚交足在线播放| 日韩欧美中文字幕精品| www..com久久爱| 色喇叭免费久久综合网| 日本性爱视频在线观看| 成熟老妇女视频| 亚洲精品日产aⅴ| 日韩成人在线观看| 中文字幕日韩欧美一区二区三区| 午夜天堂精品久久久久| 暖暖成人免费视频| 男裸体无遮挡网站| 欧美二区三区| 欧美成人激情图片网| 欧美性生交xxxxx久久久| 开心九九激情九九欧美日韩精美视频电影 | 欧美猛男男办公室激情| 国产麻豆精品在线| 女同一区二区三区| 午夜国产福利在线| 久久久久久www| 国产精品入口日韩视频大尺度| 在线不卡中文字幕播放| 成人免费毛片app| 色琪琪久久se色| 高清精品在线| hbad中文字幕| 亚洲精品国产精品国自产观看| 欧美疯狂做受xxxx高潮| 欧美日韩精品一区二区| 国产色综合一区| 日一区二区三区| 日韩大胆成人| 鲁鲁在线中文| 免费国产在线观看| 国产日产欧美视频| 久久精品国产精品青草色艺| 午夜欧美不卡精品aaaaa| 精品国产sm最大网站免费看| 亚洲午夜电影网|