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