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