mysql堵塞等级_MySQL 事务隔离级别
前言
簡(jiǎn)單來說,數(shù)據(jù)庫事務(wù)就是保證一組數(shù)據(jù)操作要么全部成功,要么全部失敗。在 MySQL 中,事務(wù)是在引擎層實(shí)現(xiàn)的。原生的 MyISAM 引擎不支持事務(wù),也是為什么 InnoDB 會(huì)取代它的重要原因之一。
隔離性與隔離級(jí)別
當(dāng)數(shù)據(jù)庫上有多個(gè)事務(wù)同時(shí)執(zhí)行的時(shí)候,根據(jù)隔離級(jí)別的不同,可能會(huì)出現(xiàn)臟讀、幻讀和不可重復(fù)讀。標(biāo)準(zhǔn)隔離級(jí)別包括讀未提交、讀提交、可重復(fù)讀和串行化。
讀未提交
如果用這種隔離級(jí)別,事務(wù)執(zhí)行的時(shí)候會(huì)讀到其他未提交事務(wù)的數(shù)據(jù),我們稱為臟讀。
客戶端A
start transaction;
update users set name = 'hello' where id = 1;
select * from users where id = 1; #此時(shí)可以讀到 name,更新為hello
客戶端B
start transaction;
select * from users where id = 1; #此時(shí)讀到 name為hello
在此隔離級(jí)別下,客戶端 B 讀到了客戶端 A 還未提交的事務(wù)即還未 commit 的事務(wù),即產(chǎn)生的臟讀現(xiàn)象。
讀提交
如果用這種隔離級(jí)別,事務(wù)執(zhí)行的時(shí)候會(huì)讀到其他已提交事務(wù)的數(shù)據(jù),我們稱為不可重復(fù)讀。
客戶端A
start transaction;
update users set name = 'hello' where id = 1;
commit;
客戶端B
start transaction;
select * from users where id = 1; #此時(shí) name不為hello
#此時(shí)客戶端A 完成 commit
select * from users where id = 1; #此時(shí) name為hello
在此隔離級(jí)別下,客戶端 B 讀到了客戶端 A 完成提交的事務(wù),產(chǎn)生了不可重復(fù)讀現(xiàn)象。
可重復(fù)讀
在同一個(gè)事務(wù)里,SELECT 語句獲得的結(jié)果是基于事務(wù)開始時(shí)間點(diǎn)的狀態(tài),同一個(gè)事務(wù)中 SELECT 語句得到的結(jié)果是一樣的,但是會(huì)有幻讀現(xiàn)象。
客戶端A
start transaction;
select * from users; #為空
#此時(shí)客戶端B 完成commit 操作
select * from users; #還是為空
insert into users(id, name) value (1, 'hello') #報(bào)主鍵沖突
客戶端B
start transaction;
select * from users; #為空
insert into users(id, name) values (1, 'hello');
commit;
在此隔離級(jí)別下,會(huì)產(chǎn)生幻讀現(xiàn)象。
串行化
在該事務(wù)級(jí)別下,事務(wù)都是串行順序執(zhí)行的,避免了臟讀,不可重復(fù)讀,幻讀問題。
客戶端A
start transaction;
insert into users(id, name) values (1, 'hello');
commit;
客戶端B
start transaction;
select * from users; #會(huì)一直堵塞住,直到客戶端A 完成提交
本文鏈接:http://www.yunweipai.com/36489.html
總結(jié)
以上是生活随笔為你收集整理的mysql堵塞等级_MySQL 事务隔离级别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 判断鼠标不在控件上_VB常用控件属性讲解
- 下一篇: 10.数据库中的内置函数