MySQL笔记-事务理论及并发存在的三个问题(脏读、不可重复读、幻读)演示
事務(wù)定義了一個(gè)服務(wù)操作序列,由服務(wù)器保證這些操作序列在多個(gè)客戶并發(fā)訪問和服務(wù)器出現(xiàn)故障情況下的原子性。
事務(wù)是在數(shù)據(jù)庫管理系統(tǒng)領(lǐng)域發(fā)展起來的,是一種對(duì)共享數(shù)據(jù)庫進(jìn)行并發(fā)訪問或錯(cuò)誤處理的泛型。
在數(shù)據(jù)庫中操作DML(insert,update,delete,select)或DDL(創(chuàng)建,改變表結(jié)構(gòu))都會(huì)發(fā)生事務(wù)。
?
事務(wù)的4個(gè)屬性:ACID:原子性、一致性、隔離性、持久性。
解決原子性的技術(shù):Redo & Undo;
解決一致性的技術(shù):Undo;
解決隔離性的技術(shù):Lock;
解決持久性的技術(shù):Redo;
?
下面還要介紹下事務(wù)的隔離級(jí)別:
Read Uncommitted:讀未提交
Read Commited:讀已提交
Repeatable Read:可重復(fù)讀
Serializable:串行
?
Read Uncommitted 級(jí)別很低,但并發(fā)很高。
oracle用Read Commited,這個(gè)級(jí)別
mysql默認(rèn)級(jí)別為Repeatable read
serializable就相當(dāng)于只有一個(gè)人用。
這張圖說明了各個(gè)級(jí)別存在及解決的問題:
mysql當(dāng)隔離級(jí)別為Repeatable Read的時(shí)候,可以解決幻讀。
但這也有個(gè)問題,并發(fā)從上到下,依次減少。
?
下面來演示下并發(fā)會(huì)存在的三個(gè)問題:
臟讀(dirty read)、不可重復(fù)讀(unrepeatable read)、幻讀(phantom read)。
?
臟讀就是讀了臟數(shù)據(jù)。
下面演示下什么叫臟讀:
上面的表中是隔離級(jí)別解決的問題。現(xiàn)在查下目前mysql的隔離級(jí)別:
show variables like '%iso%';可見這種默認(rèn)級(jí)別是演示不了臟讀的。得進(jìn)行修改,改為:READ-UNCOMMITTED
set tx_isolation='READ-UNCOMMITTED';演示以這種表為例:
show tables; select * from test; desc test;在session1中,更新一條數(shù)據(jù),然后未提交:
begin; update test set name='DDDDD' where id = 1;在session2上進(jìn)行查詢,就是被修改后的數(shù)據(jù),這就是臟數(shù)據(jù):
show variables like '%iso%'; set tx_isolation='READ-UNCOMMITTED'; select * from test;這里可以看到,讀了未提交的數(shù)據(jù),就是臟讀。
下面session1進(jìn)行回滾:
session2又正常了:
select * from test;?
下面演示下不可重復(fù)讀的問題:
在session1中查詢單條數(shù)據(jù):
select * from test where id = 1;在會(huì)話2中對(duì)這個(gè)數(shù)據(jù)進(jìn)行修改:
在session1中再次進(jìn)行select:
select * from test where id = 1;這種session1中存在的問題,就是不可重復(fù)讀。
?
?
下面演示下幻讀
在session1中查詢:
select * from test where id > 1;在session2中插入一條數(shù)據(jù):
begin; insert into test values(4, 'EEEEEEEEEEEE');在session1中再查:
select * from test where id > 1;多出來了一條,這就是幻讀
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的MySQL笔记-事务理论及并发存在的三个问题(脏读、不可重复读、幻读)演示的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java笔记-JPA保存数据时指定列不插
- 下一篇: Node.js笔记-node.js连接M