一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數(shù)據(jù)庫技術(shù)|

服務(wù)器之家 - 數(shù)據(jù)庫 - Mysql - mysql的事務(wù),隔離級別和鎖用法實例分析

mysql的事務(wù),隔離級別和鎖用法實例分析

2021-01-08 15:36懷素真 Mysql

這篇文章主要介紹了mysql的事務(wù),隔離級別和鎖用法,結(jié)合實例形式分析了MySQL事務(wù),隔離級別和鎖相關(guān)原理、用法及操作注意事項,需要的朋友可以參考下

本文實例講述了mysql事務(wù)隔離級別用法。分享給大家供大家參考,具體如下:

事務(wù)就是一組一起成功或一起失敗的sql語句。事務(wù)還應(yīng)該具備,原子性,一致性,隔離性和持久性。

一、事務(wù)的基本要素 (acid)

1、原子性:事務(wù)開始后,所有的操作,要么全部成功,要么全部失敗,不可能處于中間狀態(tài),事務(wù)是一個不可分割的整體,就像原子一樣。

2、一致性:事務(wù)開始前和結(jié)束后,數(shù)據(jù)庫的完整性約束沒有破壞,a向b轉(zhuǎn)賬,a扣了錢,但b卻沒到賬。

3、隔離性:同時發(fā)生的事務(wù)(并發(fā)事務(wù))不應(yīng)該導(dǎo)致數(shù)據(jù)庫處于不一致的狀態(tài)中,每個事務(wù)都獨立執(zhí)行,不影響其他事務(wù)的存在。

4、持久性:事務(wù)對數(shù)據(jù)庫的更改都會保存在磁盤上,不會丟失。

二、事務(wù)的并發(fā)問題

1、臟讀:事務(wù)a讀取了事務(wù)b未提交的寫入數(shù)據(jù),讀取到的數(shù)據(jù)就稱為臟數(shù)據(jù)

2、不可重復(fù)讀:事務(wù)a多次讀取同一數(shù)據(jù),但在讀取過程中,事務(wù)b對數(shù)據(jù)做了修改,并提交了。導(dǎo)致多次讀取同一數(shù)據(jù),結(jié)果不一樣。

3、幻讀:事務(wù)a對表中所有數(shù)據(jù)行進行了修改,比如設(shè)置status = 1,但同時,事務(wù)b往該表插入了一行新數(shù)據(jù)status = 0,對于操作事務(wù)a的用戶而言,表中還有一條記錄沒被修改,就像發(fā)生幻覺一樣。

三、事務(wù)隔離性的四個級別

事務(wù)隔離級別 臟讀 不可重復(fù)讀 幻讀
讀取未提交 read uncommitted

讀已提交 read committed

×

可重復(fù)讀取 repeatable read

×

×

序列化 serializable

×

×

×

四、獲取和設(shè)置數(shù)據(jù)庫隔離級別

?
1
2
show variables like '%isolation%';
show global variables like '%isolation%';

使用系統(tǒng)變量查詢

?
1
2
3
select @@global.tx_isolation;
select @@session.tx_isolation;
select @@tx_isolation;

對于mysql8而言,使用下面的變量進行查詢

?
1
2
3
select @@global.transaction_isolation;
select @@session.transaction_isolation;
select @@transaction_isolation;

設(shè)置隔離級別

?
1
2
3
set global tx_isolation = '隔離級別';
set session tx_isolation = '隔離級別';
set @@tx_isolation = '隔離級別';

對于mysql8而言,使用下面語句進行設(shè)置

?
1
2
3
set global transaction_isolation = '隔離級別';
set session transaction_isolation = '隔離級別';
set @@transaction_isolation = '隔離級別';

五、通過例子說明各隔離級別的情況

先準(zhǔn)備一張表,和一點數(shù)據(jù)。

?
1
2
3
4
5
6
7
8
9
create table `account` (
 `id` int(11) unsigned not null auto_increment comment 'id',
 `name` varchar(32) default '' comment '名稱',
 `money` decimal(11,2) default '0.00' comment '金錢',
 primary key (`id`)
) engine=innodb default charset=utf8mb4;
 
insert into `account` (`name`, `money`) values ('a', '500.00');
insert into `account` (`name`, `money`) values ('b', '100.00');

1、讀取未提交

?
1
2
set transaction_isolation = 'read-uncommitted';
set autocommit = 0;

mysql的事務(wù),隔離級別和鎖用法實例分析

事務(wù)b修改了表中的數(shù)據(jù),但是未提交,事務(wù)a確讀取到了修改后的數(shù)據(jù)。如果因為某些原因,事務(wù)b回滾了,事務(wù)a讀取的這個數(shù)據(jù)就是臟數(shù)據(jù)。

2、讀已提交

?
1
2
set transaction_isolation = 'read-committed';
set autocommit = 0;

mysql的事務(wù),隔離級別和鎖用法實例分析

事務(wù)b修改數(shù)據(jù)但沒有提交,那么事務(wù)a仍然獲取的原來數(shù)據(jù),解決了臟讀的問題。

但是事務(wù)b提交,事務(wù)a執(zhí)行上一次查詢,結(jié)果與上一次查詢不一致,這就產(chǎn)生不可重復(fù)讀的問題。

mysql的事務(wù),隔離級別和鎖用法實例分析

3、可重復(fù)讀取

?
1
2
set transaction_isolation = 'repeatable-read';
set autocommit = 0;

mysql的事務(wù),隔離級別和鎖用法實例分析

事務(wù)b修改了數(shù)據(jù)并提交了,事務(wù)a兩次查詢的結(jié)果是一致的,解決了不可重復(fù)讀的問題。

這個時候,事務(wù)a去修改name為a的money數(shù)據(jù)

mysql的事務(wù),隔離級別和鎖用法實例分析

name為a的money變成了350,而不是400,可重復(fù)讀保證了數(shù)據(jù)的一致性。

我們重新在事務(wù)a中修改所有賬號的money等于200,同時在事務(wù)b中插入一條新的數(shù)據(jù)。

mysql的事務(wù),隔離級別和鎖用法實例分析

事務(wù)a中獲取的仍然是兩條數(shù)據(jù),解決了新增數(shù)據(jù)時,事務(wù)a出現(xiàn)的幻讀問題。

4、序列化

?
1
2
set transaction_isolation = 'serializable';
set autocommit = 0;

mysql的事務(wù),隔離級別和鎖用法實例分析

事務(wù)a對表進行查詢,如果沒有提交,則事務(wù)b的插入語句一直等待在那里,直到超時或事務(wù)a提交。

反之,事務(wù)b對表進行插入后,沒有提交,則事務(wù)a對表的查詢也一直等待,直到事務(wù)b提交。

此時對表的讀寫都會進行鎖表,當(dāng)然對并發(fā)性能的影響也比較大。

隔離級別越高,越能保證數(shù)據(jù)的完整性和一致性。

六、mysql的鎖

鎖分為兩種類型:

內(nèi)部鎖:mysql服務(wù)器內(nèi)部執(zhí)行的內(nèi)部鎖,以管理多個會話對表內(nèi)容的爭用。

外部鎖:mysql為客戶會話提供顯式地獲取表鎖,以阻止其他會話訪問表。

內(nèi)部鎖又會為兩種類型:

1、行級鎖:行級鎖是細(xì)粒度的,只有被訪問的行會被鎖定,這允許多個會話同時進行寫訪問。

2、表級鎖:mysql對myisam,memory和merge表使用表級鎖,一次只允許一個會話更新表,這使得這些存儲引擎更適用于以讀取為主的操作。

外部鎖:可以使用 lock table 和 unlock table 來控制鎖定。

read (共享鎖) :多個會話可以從表中讀取數(shù)據(jù)而不需要獲取鎖,此外,多個會話可以在同一表上獲得鎖,當(dāng) read 鎖時,沒有會話可以將數(shù)據(jù)寫入表中。任何寫入操作都將處于等待狀態(tài),直到 read 鎖被釋放。

write (排他鎖) :當(dāng)表被 write 鎖定時,除持有該鎖的會話外,其他會話都不能讀取或?qū)懭霐?shù)據(jù),除非 write 鎖被釋放。

鎖表的語句:

?
1
lock tables table_name [read | write];

解鎖表的語句:

?
1
unlock tables;

鎖定數(shù)據(jù)庫中所有表:

?
1
flush tables with read lock;

希望本文所述對大家MySQL數(shù)據(jù)庫計有所幫助。

原文鏈接:https://www.cnblogs.com/jkko123/p/10181870.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲色图欧美图片 | 午夜爱 | 国产精品林美惠子在线观看 | 嫩草视频在线观看免费 | 亚洲第一区欧美日韩精品 | 好大水好多好爽好硬好深视频 | 女毛片 | 国产偷窥女洗浴在线观看亚洲 | 欧美一区二区三区视视频 | 美女脱一光二净的视频 | 99久久免费看精品国产一区 | 韩国一级淫片特黄特刺激 | 精品久久免费视频 | 欧美综合亚洲图片综合区 | 精品国产91久久久久久久a | 亚洲白拍| 摸咪网在线影院在线观看 | h在线动漫 | 91porn最新地址| av中文字幕网免费观看 | 日本无吗免费一二区 | 国产麻豆麻豆 | 青青青久在线视频免费观看 | 美女扒开粉嫩尿口漫画 | 末发育xxxxx仙踪林 | 99最新网址 | 火影忍者小南裸羞羞漫画 | 国产精品自在线拍 | 国产精品久久久久久久久免费 | 日韩高清成人毛片不卡 | 免费看一级毛片 | 双性鞭蒂软汁淋漓 | 日韩无砖专区2020在线 | 日本在线播放视频 | 日韩理论片在线看免费观看 | 日本人成年视频在线观看 | 国产做a爰片久久毛片 | 爱爱调教 | 久久精选视频 | 亚洲福利区 | 韩国最新理论片奇忧影院 |