3.mysql事務(wù)特性(臟讀责掏,可重復(fù)讀柜砾,幻讀)

3.mysql事務(wù)

事務(wù)sql相關(guān)語法

-- 1.查看當(dāng)前表的存儲引擎
show create table te ;
show variables like '%storage_engine%';
-- 2.開啟事務(wù)、事務(wù)回滾换衬、事務(wù)提交痰驱、還原點(diǎn)
begin/rollback/commit/savepoint
show variables like '%autocommit%'
-- 關(guān)閉自動提交
set autocommit = 0;
insert into te values(3,3);
savepoint n1;
insert into te values(4,4);
savepoint n2;
insert into te values(5,5);
rollback to savepoint n1;

select * from te

關(guān)閉事務(wù)自動提交,插入3,set n1,插入4,set n2,插入5 查詢?nèi)龡l已插入瞳浦,執(zhí)行rollback n1担映,查詢有一條數(shù)據(jù)
插入

1) 特性ACID

1.原子性:一個(gè)事務(wù)是不可分割的工作單位,一批操作要么成功要么失敗
例,a轉(zhuǎn)b100元叫潦,a賬號減100蝇完,b賬號就增加100;
2.一致性:從一個(gè)一致性狀態(tài)變到另一個(gè)一致性狀態(tài),
例,a轉(zhuǎn)b100元,a賬號減100短蜕,b賬號就增加100,增加和扣減的符合氢架,這就是一直性 
3.隔離性:一個(gè)事務(wù)執(zhí)行不能被其它事務(wù)干擾,
4.持久性:一個(gè)事務(wù)一旦提交朋魔,它對數(shù)據(jù)庫中的數(shù)據(jù)改變就應(yīng)該是永久性
例,事務(wù)提交了岖研,數(shù)據(jù)就會被持久到磁盤中
隔離性

1.未提交讀(臟讀) read uncommitted

事務(wù)a讀取了事務(wù)b更新的數(shù)據(jù),然后b回滾警检,那么a讀取到就是臟數(shù)據(jù)

CREATE TABLE `te` (
  `id` int(11) NOT NULL,
  `score` int(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf16 COLLATE=utf16_bin
insert into te values(1,100);


原數(shù)據(jù)
id  score
1   100
事務(wù)a
-- 1. 設(shè)置未提交讀
set session transaction isolation level read uncommitted;
-- 2.開啟事務(wù)
begin
update te set score = score -1 where id = 1;
select * from te where id = 1;
-- 3.事務(wù)回滾
ROLLBACK

事務(wù)b
-- 1. 設(shè)置未提交讀
set session transaction isolation level read uncommitted;
-- 2.開啟事務(wù)
begin
-- 3.查詢
select * from te where id = 1;

先執(zhí)行a1 a2 然后執(zhí)行b1 b2 執(zhí)行a-update操作孙援,然后執(zhí)行b3,結(jié)果為99扇雕,然后a3回滾事務(wù)拓售,b3讀取的就是臟數(shù)據(jù)

2.已提提交讀(不可重復(fù)讀)-read commited

事務(wù)a多次讀取同一條數(shù)據(jù),事務(wù)b修改了數(shù)據(jù)并提交镶奉,導(dǎo)致事務(wù)a讀取到的數(shù)據(jù)前后不一致

事務(wù)a
-- 1. 設(shè)置已提提交讀(不可重復(fù)讀)
set session transaction isolation level read committed;
-- 2.開啟事務(wù)
begin
update te set score = score -1 where id = 1;
-- 3.查詢
select * from te where id = 1;
-- 4.事務(wù)回滾
ROLLBACK

事務(wù)b
-- 1. 設(shè)置已提提交讀(不可重復(fù)讀)
set session transaction isolation level read committed;
-- 2.開啟事務(wù)
begin
-- 3.查詢
select * from te where id = 1;
commit

先執(zhí)行a1 a2 然后執(zhí)行b1 b2 執(zhí)行a-update操作础淤,執(zhí)行a3為結(jié)果查詢?yōu)?9,而b3查詢結(jié)果還是100
但是事務(wù)a提交了哨苛,b3查詢則為99值骇,這就是跟可重復(fù)讀區(qū)別

3.可重復(fù)讀-repeatable read

事務(wù)a開啟,事務(wù)b開啟移国,事務(wù)a修改后,提交事務(wù)道伟,事務(wù)b查詢時(shí)修改前的數(shù)據(jù)

事務(wù)a 
-- 1.設(shè)置已提提交讀(不可重復(fù)讀)
set session transaction isolation level repeatable read;
-- 2.開啟事務(wù)
begin
update te set score = score -1 where id = 1;
-- 3.查詢
select * from te where id = 1;
-- 4.事務(wù)回滾
ROLLBACK
commit

事務(wù)b
-- 1. 設(shè)置已提提交讀(不可重復(fù)讀)
set session transaction isolation level repeatable read;
-- 2.開啟事務(wù)
begin;
-- 3.查詢
select * from te where id = 1;
commit

先執(zhí)行a1 a2 然后執(zhí)行b1 b2,然后執(zhí)行a-update迹缀,查詢a3結(jié)果為99,查詢b3結(jié)果為100蜜徽,然后事務(wù)commit祝懂,
繼續(xù)查詢b3結(jié)果還是100,然后b3commit拘鞋,重新執(zhí)行b3砚蓬,結(jié)果則變成99

4.可串行讀-serializable

幻讀:事務(wù)a開啟,將表中所有數(shù)據(jù)修改成1盆色,同時(shí)事務(wù)b插入一條值為2的數(shù)據(jù)灰蛙,a就會發(fā)現(xiàn)自己并未完全修改好,
sql就不來演示了

總結(jié)

  • 1.事務(wù)隔離級別為可重復(fù)讀隔躲,如果有索引的時(shí)候摩梧,已索引為條件更新數(shù)據(jù),會存在行鎖宣旱、頁鎖仅父、間隙鎖的問題,如果沒有索引,更新數(shù)據(jù)時(shí)會鎖住整張表(行鎖升級為表鎖);
  • 2.隔離級別越高笙纤,越能保證事務(wù)的一致性耗溜,并發(fā)性能就較低,根據(jù)自己應(yīng)用省容,合理選擇事務(wù)的隔離級別;
  • 3.不可重復(fù)讀側(cè)重于修改抖拴,幻讀側(cè)重于新增和刪除,解決不可重復(fù)讀鎖行蓉冈,而幻讀則要鎖表;
  • 4.事務(wù)級別為串行化時(shí)城舞,讀寫數(shù)據(jù)則會鎖住整張表;

(1)mysql 什么情況下行鎖會升級為表鎖

如果我們where條件對索引列進(jìn)行上鎖,不會出現(xiàn);如果我們where條件對非索引列進(jìn)行上鎖寞酿,則會出現(xiàn)表鎖變成行鎖

CREATE TABLE `course` (
  `id` varchar(35) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `subject` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `my_like` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `real_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `reg_date` date DEFAULT NULL,
  `score` int(255) DEFAULT NULL,
  `reg_Valid` varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

BEGIN
select * from course where name = '張三1' for update
-- 上述只針對name='張三1'進(jìn)行行鎖家夺,但是會發(fā)現(xiàn)執(zhí)行下面sql會出現(xiàn)等待,說明已經(jīng)升級為表鎖
update course set name = 'summit' where id = 5
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末伐弹,一起剝皮案震驚了整個(gè)濱河市拉馋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌惨好,老刑警劉巖煌茴,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異日川,居然都是意外死亡蔓腐,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門龄句,熙熙樓的掌柜王于貴愁眉苦臉地迎上來回论,“玉大人,你說我怎么就攤上這事分歇】兀” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵职抡,是天一觀的道長葬燎。 經(jīng)常有香客問我,道長缚甩,這世上最難降的妖魔是什么谱净? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮擅威,結(jié)果婚禮上岳遥,老公的妹妹穿的比我還像新娘。我一直安慰自己裕寨,他們只是感情好浩蓉,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布派继。 她就那樣靜靜地躺著,像睡著了一般捻艳。 火紅的嫁衣襯著肌膚如雪驾窟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天认轨,我揣著相機(jī)與錄音绅络,去河邊找鬼。 笑死嘁字,一個(gè)胖子當(dāng)著我的面吹牛恩急,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播纪蜒,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼衷恭,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了纯续?” 一聲冷哼從身側(cè)響起随珠,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎猬错,沒想到半個(gè)月后窗看,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡倦炒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年显沈,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逢唤。...
    茶點(diǎn)故事閱讀 38,617評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡构罗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出智玻,到底是詐尸還是另有隱情,我是刑警寧澤芙代,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布吊奢,位于F島的核電站,受9級特大地震影響纹烹,放射性物質(zhì)發(fā)生泄漏页滚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一铺呵、第九天 我趴在偏房一處隱蔽的房頂上張望裹驰。 院中可真熱鬧,春花似錦片挂、人聲如沸幻林。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽沪饺。三九已至躏敢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間整葡,已是汗流浹背件余。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留遭居,地道東北人啼器。 一個(gè)月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像俱萍,于是被迫代替她去往敵國和親端壳。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 索引 數(shù)據(jù)庫中的查詢操作非常普遍,索引就是提升查找速度的一種手段 索引的類型 從數(shù)據(jù)結(jié)構(gòu)角度分 1.B+索引:傳統(tǒng)...
    一凡呀閱讀 2,879評論 0 8
  • --- layout: post title: "如果有人問你關(guān)系型數(shù)據(jù)庫的原理腥寇,叫他看這篇文章(轉(zhuǎn))" date...
    藍(lán)墜星閱讀 780評論 0 3
  • 作者:劉仁鵬參考資料: 《MySQL技術(shù)內(nèi)幕 InnoDB存儲引擎》 MySQL的并發(fā)控制與加鎖分析 1.基礎(chǔ)知識...
    agile4j閱讀 5,467評論 5 17
  • 起初成翩,阿蘇被照顧的很好。 谷子作為主糧赦役,零食有紫蘇籽(據(jù)說這是鳥類的最愛)麻敌,墨魚骨(補(bǔ)鈣),蘋果掂摔,黃瓜粒(補(bǔ)充維生...
    顧的貓寧閱讀 145評論 0 5
  • 和小馬在青島山科交流中心搗鼓網(wǎng)站的時(shí)候术羔,把古龍所寫的大人物讀完了。記得電視劇中不是這樣的乙漓,在小說中我記下了好多句子...
    放不下屠刀的佛閱讀 759評論 0 0