精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

深入理解MySQL——鎖、事務(wù)與并發(fā)控制

數(shù)據(jù)庫(kù) MySQL
本文對(duì)鎖、事務(wù)、并發(fā)控制做一個(gè)總結(jié),看了網(wǎng)上很多文章,描述非常不準(zhǔn)確。如有與您觀點(diǎn)不一致,歡迎有理有據(jù)的拍磚!
本文對(duì)鎖、事務(wù)、并發(fā)控制做一個(gè)總結(jié),看了網(wǎng)上很多文章,描述非常不準(zhǔn)確。如有與您觀點(diǎn)不一致,歡迎有理有據(jù)的拍磚!

mysql服務(wù)器邏輯架構(gòu)

每個(gè)連接都會(huì)在mysql服務(wù)端產(chǎn)生一個(gè)線程(內(nèi)部通過(guò)線程池管理線程),比如一個(gè)select語(yǔ)句進(jìn)入,mysql首先會(huì)在查詢(xún)緩存中查找是否緩存了這個(gè)select的結(jié)果集,如果沒(méi)有則繼續(xù)執(zhí)行 解析、優(yōu)化、執(zhí)行的過(guò)程;否則會(huì)之間從緩存中獲取結(jié)果集。

mysql并發(fā)控制——共享鎖、排他鎖

共享鎖

共享鎖也稱(chēng)為讀鎖,讀鎖允許多個(gè)連接可以同一時(shí)刻并發(fā)的讀取同一資源,互不干擾;

排他鎖

排他鎖也稱(chēng)為寫(xiě)鎖,一個(gè)寫(xiě)鎖會(huì)阻塞其他的寫(xiě)鎖或讀鎖,保證同一時(shí)刻只有一個(gè)連接可以寫(xiě)入數(shù)據(jù),同時(shí)防止其他用戶(hù)對(duì)這個(gè)數(shù)據(jù)的讀寫(xiě)。

鎖策略

鎖的開(kāi)銷(xiāo)是較為昂貴的,鎖策略其實(shí)就是保證了線程安全的同時(shí)獲取最大的性能之間的平衡策略。

  • mysql鎖策略:talbe lock(表鎖)

表鎖是mysql最基本的鎖策略,也是開(kāi)銷(xiāo)最小的鎖,它會(huì)鎖定整個(gè)表;

具體情況是:若一個(gè)用戶(hù)正在執(zhí)行寫(xiě)操作,會(huì)獲取排他的“寫(xiě)鎖”,這可能會(huì)鎖定整個(gè)表,阻塞其他用戶(hù)的讀、寫(xiě)操作;

若一個(gè)用戶(hù)正在執(zhí)行讀操作,會(huì)先獲取共享鎖“讀鎖”,這個(gè)鎖運(yùn)行其他讀鎖并發(fā)的對(duì)這個(gè)表進(jìn)行讀取,互不干擾。只要沒(méi)有寫(xiě)鎖的進(jìn)入,讀鎖可以是并發(fā)讀取統(tǒng)一資源的。

通常發(fā)生在DDL語(yǔ)句\DML不走索引的語(yǔ)句中,比如這個(gè)DML update table set columnA=”A” where columnB=“B”. 
如果columnB字段不存在索引(或者不是組合索引前綴),會(huì)鎖住所有記錄也就是鎖表。如果語(yǔ)句的執(zhí)行能夠執(zhí)行一個(gè)columnB字段的索引,那么會(huì)鎖住滿足where的行(行鎖)。

  • mysql鎖策略:row lock(行鎖)

行鎖可以最大限度的支持并發(fā)處理,當(dāng)然也帶來(lái)了最大開(kāi)銷(xiāo),顧名思義,行鎖的粒度實(shí)在每一條行數(shù)據(jù)。

事務(wù)

事務(wù)就是一組原子性的sql,或者說(shuō)一個(gè)獨(dú)立的工作單元。 
事務(wù)就是說(shuō),要么mysql引擎會(huì)全部執(zhí)行這一組sql語(yǔ)句,要么全部都不執(zhí)行(比如其中一條語(yǔ)句失敗的話)。

比如,tim要給bill轉(zhuǎn)賬100塊錢(qián): 
1.檢查tim的賬戶(hù)余額是否大于100塊; 
2.tim的賬戶(hù)減少100塊; 
3.bill的賬戶(hù)增加100塊; 
這三個(gè)操作就是一個(gè)事務(wù),必須打包執(zhí)行,要么全部成功,要么全部不執(zhí)行,其中任何一個(gè)操作的失敗都會(huì)導(dǎo)致所有三個(gè)操作“不執(zhí)行”——回滾。  

  1. CREATE DATABASE IF NOT EXISTS employees; 
  2. USE employees; 
  3.  
  4. CREATE TABLE `employees`.`account` ( 
  5.  `id` BIGINT (11) NOT NULL AUTO_INCREMENT, 
  6.  `p_name` VARCHAR (4), 
  7.  `p_money` DECIMAL (10, 2) NOT NULL DEFAULT 0, 
  8.  PRIMARY KEY (`id`) 
  9. ) ; 
  10. INSERT INTO `employees`.`account` (`id`, `p_name`, `p_money`) VALUES ('1''tim''200');  
  11. INSERT INTO `employees`.`account` (`id`, `p_name`, `p_money`) VALUES ('2''bill''200');  
  12.  
  13. START TRANSACTION
  14. SELECT p_money FROM account WHERE p_name="tim";-- step1 
  15. UPDATE account SET p_money=p_money-100 WHERE p_name="tim";-- step2 
  16. UPDATE account SET p_money=p_money+100 WHERE p_name="bill";-- step3 
  17. COMMIT 

一個(gè)良好的事務(wù)系統(tǒng),必須滿足ACID特點(diǎn):

事務(wù)的ACID

  • A:atomiciy原子性 
    一個(gè)事務(wù)必須保證其中的操作要么全部執(zhí)行,要么全部回滾,不可能存在只執(zhí)行了一部分這種情況出現(xiàn)。

  • C:consistency一致性 
    數(shù)據(jù)必須保證從一種一致性的狀態(tài)轉(zhuǎn)換為另一種一致性狀態(tài)。 
    比如上一個(gè)事務(wù)中執(zhí)行了第二步時(shí)系統(tǒng)崩潰了,數(shù)據(jù)也不會(huì)出現(xiàn)bill的賬戶(hù)少了100塊,但是tim的賬戶(hù)沒(méi)變的情況。要么維持原裝(全部回滾),要么bill少了100塊同時(shí)tim多了100塊,只有這兩種一致性狀態(tài)的

  • I:isolation隔離性 
    在一個(gè)事務(wù)未執(zhí)行完畢時(shí),通常會(huì)保證其他Session 無(wú)法看到這個(gè)事務(wù)的執(zhí)行結(jié)果

  • D:durability持久性 
    事務(wù)一旦commit,則數(shù)據(jù)就會(huì)保存下來(lái),即使提交完之后系統(tǒng)崩潰,數(shù)據(jù)也不會(huì)丟失。

隔離級(jí)別

 


 查看系統(tǒng)隔離級(jí)別:
 select @@global.tx_isolation;
 查看當(dāng)前會(huì)話隔離級(jí)別
 select @@tx_isolation;
 設(shè)置當(dāng)前會(huì)話隔離級(jí)別
 SET session TRANSACTION ISOLATION LEVEL serializable;
 設(shè)置全局系統(tǒng)隔離級(jí)別
 SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; 
 

READ UNCOMMITTED(未提交讀,可臟讀)

事務(wù)中的修改,即使沒(méi)有提交,對(duì)其他會(huì)話也是可見(jiàn)的。 
可以讀取未提交的數(shù)據(jù)——臟讀。臟讀會(huì)導(dǎo)致很多問(wèn)題,一般不適用這個(gè)隔離級(jí)別。 
實(shí)例:  

  1. -- ------------------------- read-uncommitted實(shí)例 ------------------------------ 
  2. -- 設(shè)置全局系統(tǒng)隔離級(jí)別 
  3. SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
  4. -- Session A 
  5. START TRANSACTION
  6. SELECT * FROM USER
  7. UPDATE USER SET NAME="READ UNCOMMITTED"
  8. -- commit; 
  9.  
  10. -- Session B 
  11. SELECT * FROM USER
  12.  
  13. //SessionB Console 可以看到Session A未提交的事物處理,在另一個(gè)Session 中也看到了,這就是所謂的臟讀 
  14. id  name 
  15. 2   READ UNCOMMITTED 
  16. 34  READ UNCOMMITTED  

READ COMMITTED(提交讀或不可重復(fù)讀,幻讀)

一般數(shù)據(jù)庫(kù)都默認(rèn)使用這個(gè)隔離級(jí)別(mysql不是),這個(gè)隔離級(jí)別保證了一個(gè)事務(wù)如果沒(méi)有完全成功(commit執(zhí)行完),事務(wù)中的操作對(duì)其他會(huì)話是不可見(jiàn)的。  

  1. -- ------------------------- read-cmmitted實(shí)例 ------------------------------ 
  2. -- 設(shè)置全局系統(tǒng)隔離級(jí)別 
  3. SET GLOBAL TRANSACTION ISOLATION LEVEL READ  COMMITTED
  4. -- Session A 
  5. START TRANSACTION
  6. SELECT * FROM USER
  7. UPDATE USER SET NAME="READ COMMITTED"
  8. -- COMMIT; 
  9.  
  10. -- Session B 
  11. SELECT * FROM USER
  12.  
  13. //Console OUTPUT
  14. id  name 
  15. 2   READ UNCOMMITTED 
  16. 34  READ UNCOMMITTED 
  17.  
  18.  
  19. --------------------------------------------------- 
  20. -- 當(dāng) Session  A執(zhí)行了commit,Session B得到如下結(jié)果: 
  21. id  name 
  22. 2   READ COMMITTED 
  23. 34  READ COMMITTED  

也就驗(yàn)證了read committed級(jí)別在事物未完成commit操作之前修改的數(shù)據(jù)對(duì)其他Session 不可見(jiàn),執(zhí)行了commit之后才會(huì)對(duì)其他Session 可見(jiàn)。 
我們可以看到Session B兩次查詢(xún)得到了不同的數(shù)據(jù)。

read committed隔離級(jí)別解決了臟讀的問(wèn)題,但是會(huì)對(duì)其他Session 產(chǎn)生兩次不一致的讀取結(jié)果(因?yàn)榱硪粋€(gè)Session 執(zhí)行了事務(wù),一致性變化)。


REPEATABLE READ(可重復(fù)讀)

一個(gè)事務(wù)中多次執(zhí)行統(tǒng)一讀SQL,返回結(jié)果一樣。 
這個(gè)隔離級(jí)別解決了臟讀的問(wèn)題,幻讀問(wèn)題。這里指的是innodb的rr級(jí)別,innodb中使用next-key鎖對(duì)”當(dāng)前讀”進(jìn)行加鎖,鎖住行以及可能產(chǎn)生幻讀的插入位置,阻止新的數(shù)據(jù)插入產(chǎn)生幻行。 
下文中詳細(xì)分析。

具體請(qǐng)參考mysql手冊(cè)

https://dev.mysql.com/doc/refman/5.7/en/innodb-storage-engine.html

 

SERIALIZABLE(可串行化)

最強(qiáng)的隔離級(jí)別,通過(guò)給事務(wù)中每次讀取的行加鎖,寫(xiě)加寫(xiě)鎖,保證不產(chǎn)生幻讀問(wèn)題,但是會(huì)導(dǎo)致大量超時(shí)以及鎖爭(zhēng)用問(wèn)題。

多版本并發(fā)控制-MVCC

MVCC(multiple-version-concurrency-control)是個(gè)行級(jí)鎖的變種,它在普通讀情況下避免了加鎖操作,因此開(kāi)銷(xiāo)更低。 
雖然實(shí)現(xiàn)不同,但通常都是實(shí)現(xiàn)非阻塞讀,對(duì)于寫(xiě)操作只鎖定必要的行

  • 一致性讀 (就是讀取快照) 
    select * from table ….;

  • 當(dāng)前讀(就是讀取實(shí)際的持久化的數(shù)據(jù)) 
    特殊的讀操作,插入/更新/刪除操作,屬于當(dāng)前讀,處理的都是當(dāng)前的數(shù)據(jù),需要加鎖。 
    select * from table where ? lock in share mode; 
    select * from table where ? for update; 
    insert; 
    update ; 
    delete;

注意:select …… from where…… (沒(méi)有額外加鎖后綴)使用MVCC,保證了讀快照(mysql稱(chēng)為consistent read),所謂一致性讀或者讀快照就是讀取當(dāng)前事務(wù)開(kāi)始之前的數(shù)據(jù)快照,在這個(gè)事務(wù)開(kāi)始之后的更新不會(huì)被讀到。詳細(xì)情況下文select的詳述。

對(duì)于加鎖讀SELECT with FOR UPDATE(排他鎖) or LOCK IN SHARE MODE(共享鎖)、update、delete語(yǔ)句,要考慮是否是唯一索引的等值查詢(xún)。

寫(xiě)鎖-recordLock,gapLock,next key lock

對(duì)于使用到唯一索引 等值查詢(xún):比如,where columnA=”…” ,如果columnA上的索引被使用到, 
那么會(huì)在滿足where的記錄上加行鎖(for update是排他鎖,lock in shared 是共享鎖,其他寫(xiě)操作加排他鎖)。這里是行級(jí)鎖,record lock。

對(duì)于范圍查詢(xún)(使用非唯一的索引): 
比如(做范圍查詢(xún)):where columnA between 10 and 30 ,會(huì)導(dǎo)致其他會(huì)話中10以后的數(shù)據(jù)都無(wú)法插入(next key lock),從而解決了幻讀問(wèn)題。

這里是next key lock 會(huì)包括涉及到的所有行。 
next key lock=recordLock+gapLock,不僅鎖住相關(guān)數(shù)據(jù),而且鎖住邊界,從而徹底避免幻讀

對(duì)于沒(méi)有索引 
鎖表 
通常發(fā)生在DDL語(yǔ)句\DML不走索引的語(yǔ)句中,比如這個(gè)DML update table set columnA=”A” where columnB=“B”. 
如果columnB字段不存在索引(或者不是組合索引前綴),會(huì)鎖住所有記錄也就是鎖表。如果語(yǔ)句的執(zhí)行能夠執(zhí)行一個(gè)columnB字段的索引,那么會(huì)鎖住滿足where的行(行鎖)。

INNODB的MVCC通常是通過(guò)在每行數(shù)據(jù)后邊保存兩個(gè)隱藏的列來(lái)實(shí)現(xiàn)(其實(shí)是三列,第三列是用于事務(wù)回滾,此處略去), 
一個(gè)保存了行的創(chuàng)建版本號(hào),另一個(gè)保存了行的更新版本號(hào)(上一次被更新數(shù)據(jù)的版本號(hào)) 
這個(gè)版本號(hào)是每個(gè)事務(wù)的版本號(hào),遞增的。

這樣保證了innodb對(duì)讀操作不需要加鎖也能保證正確讀取數(shù)據(jù)。

MVCC select無(wú)鎖操作 與 維護(hù)版本號(hào)

下邊在mysql默認(rèn)的Repeatable Read隔離級(jí)別下,具體看看MVCC操作:

  • Select(快照讀,所謂讀快照就是讀取當(dāng)前事務(wù)之前的數(shù)據(jù)。): 
    a.InnoDB只select查找版本號(hào)早于當(dāng)前版本號(hào)的數(shù)據(jù)行,這樣保證了讀取的數(shù)據(jù)要么是在這個(gè)事務(wù)開(kāi)始之前就已經(jīng)commit了的(早于當(dāng)前版本號(hào)),要么是在這個(gè)事務(wù)自身中執(zhí)行創(chuàng)建操作的數(shù)據(jù)(等于當(dāng)前版本號(hào))。

    b.查找行的更新版本號(hào)要么未定義,要么大于當(dāng)前的版本號(hào)(為了保證事務(wù)可以讀到老數(shù)據(jù)),這樣保證了事務(wù)讀取到在當(dāng)前事務(wù)開(kāi)始之后未被更新的數(shù)據(jù)。 
    注意: 這里的select不能有for update、lock in share 語(yǔ)句。 
    總之要只返回滿足以下條件的行數(shù)據(jù),達(dá)到了快照讀的效果:  

(行創(chuàng)建版本號(hào)< =當(dāng)前版本號(hào) && (行更新版本號(hào)==null or 行更新版本號(hào)>當(dāng)前版本號(hào) ) ) 
  • Insert

    InnoDB為這個(gè)事務(wù)中新插入的行,保存當(dāng)前事務(wù)版本號(hào)的行作為行的行創(chuàng)建版本號(hào)。

  • Delete 
    InnoDB為每一個(gè)刪除的行保存當(dāng)前事務(wù)版本號(hào),作為行的刪除標(biāo)記。

  • Update

    將存在兩條數(shù)據(jù),保持當(dāng)前版本號(hào)作為更新后的數(shù)據(jù)的新增版本號(hào),同時(shí)保存當(dāng)前版本號(hào)作為老數(shù)據(jù)行的更新版本號(hào)。

 

當(dāng)前版本號(hào)—寫(xiě)—>新數(shù)據(jù)行創(chuàng)建版本號(hào) && 當(dāng)前版本號(hào)—寫(xiě)—>老數(shù)據(jù)更新版本號(hào)(); 

臟讀 vs 幻讀 vs 不可重復(fù)讀

臟讀一事務(wù)未提交的中間狀態(tài)的更新數(shù)據(jù) 被其他會(huì)話讀取到。 當(dāng)一個(gè)事務(wù)正在訪問(wèn)數(shù)據(jù),并且對(duì)數(shù)據(jù)進(jìn)行了修改,而這種修改還沒(méi)有 提交到數(shù)據(jù)庫(kù)中(commit未執(zhí)行),這時(shí),另外會(huì)話也訪問(wèn)這個(gè)數(shù)據(jù),因?yàn)檫@個(gè)數(shù)據(jù)是還沒(méi)有提交, 那么另外一個(gè)會(huì)話讀到的這個(gè)數(shù)據(jù)是臟數(shù)據(jù),依據(jù)臟數(shù)據(jù)所做的操作也可能是不正確的。

不可重復(fù)讀簡(jiǎn)單來(lái)說(shuō)就是在一個(gè)事務(wù)中讀取的數(shù)據(jù)可能產(chǎn)生變化,ReadCommitted也稱(chēng)為不可重復(fù)讀

在同一事務(wù)中,多次讀取同一數(shù)據(jù)返回的結(jié)果有所不同。換句話說(shuō)就是,后續(xù)讀取可以讀到另一會(huì)話事務(wù)已提交的更新數(shù)據(jù)。 相反,“可重復(fù)讀”在同一事務(wù)中多次讀取數(shù)據(jù)時(shí),能夠保證所讀數(shù)據(jù)一樣,也就是,后續(xù)讀取不能讀到另一會(huì)話事務(wù)已提交的更新數(shù)據(jù)。

幻讀:會(huì)話T1事務(wù)中執(zhí)行一次查詢(xún),然后會(huì)話T2新插入一行記錄,這行記錄恰好可以滿足T1所使用的查詢(xún)的條件。然后T1又使用相同 的查詢(xún)?cè)俅螌?duì)表進(jìn)行檢索,但是此時(shí)卻看到了事務(wù)T2剛才插入的新行。這個(gè)新行就稱(chēng)為“幻像”,因?yàn)閷?duì)T1來(lái)說(shuō)這一行就像突然 出現(xiàn)的一樣。 
innoDB的RR級(jí)別無(wú)法做到完全避免幻讀,下文詳細(xì)分析。  

  1. ----------------------------------前置準(zhǔn)備---------------------------------------- 
  2. prerequisite: 
  3. -- 創(chuàng)建表 
  4. mysql> 
  5. CREATE TABLE `t_bitfly` ( 
  6.   `id` bigint(20) NOT NULL DEFAULT '0'
  7.   `value` varchar(32) DEFAULT NULL
  8.   PRIMARY KEY (`id`) 
  9.  
  10. -- 確保當(dāng)前隔離級(jí)別為默認(rèn)的RR級(jí)別 
  11.  
  12. mysql> select @@global.tx_isolation, @@tx_isolation; 
  13. +-----------------------+-----------------+ 
  14. | @@global.tx_isolation | @@tx_isolation  | 
  15. +-----------------------+-----------------+ 
  16. REPEATABLE-READ       | REPEATABLE-READ | 
  17. +-----------------------+-----------------+ 
  18. 1 row in set (0.00 sec) 
  19. ---------------------------------------開(kāi)始---------------------------------------------  
  20.  
  21.  
  22. session A                                           |   session B 
  23.                                                    | 
  24.                                                    | 
  25. mysql> START TRANSACTION;                           |   mysql> START TRANSACTION
  26. Query OK, 0 rows affected (0.00 sec)                |   Query OK, 0 rows affected (0.00 sec)                                         
  27.                                                     |    
  28.                                                    | 
  29. mysql> SELECT * FROM test.t_bitfly;                 |   mysql> SELECT * FROM test.t_bitfly;  
  30. Empty set (0.00 sec)                                |   Empty set (0.00 sec) 
  31.                                                    | 
  32.                                                    |   mysql> INSERT INTO t_bitfly VALUES (1, 'test'); 
  33.                                                     |   Query OK, 1 row affected (0.00 sec) 
  34.                                                    | 
  35.                                                    | 
  36. mysql> SELECT * FROM test.t_bitfly;                 | 
  37. Empty set (0.00 sec)                                | 
  38.                                                    | 
  39.                                                    |   mysql> commit
  40.                                                    |   Query OK, 0 rows affected (0.01 sec)                                                 
  41. mysql> SELECT * FROM test.t_bitfly;                 | 
  42. Empty set (0.00 sec)                                | 
  43. -- 可以看到雖然兩次執(zhí)行結(jié)果返回的數(shù)據(jù)一致,         | 
  44. -- 但是不能說(shuō)明沒(méi)有幻讀。接著看:                   | 
  45.                                                    | 
  46. mysql> INSERT INTO t_bitfly VALUES (1, 'test');     | 
  47. ERROR 1062 (23000):                                 | 
  48. Duplicate entry '1' for key 'PRIMARY'               | 
  49.                                                    | 
  50. -- 明明為空的表,為什么說(shuō)主鍵重復(fù)?——幻讀出現(xiàn) !!!       |  

如何保證rr級(jí)別絕對(duì)不產(chǎn)生幻讀?

在使用的select …where語(yǔ)句中加入 for update(排他鎖) 或者 lock in share mode(共享鎖)語(yǔ)句來(lái)實(shí)現(xiàn)。其實(shí)就是鎖住了可能造成幻讀的數(shù)據(jù),阻止數(shù)據(jù)的寫(xiě)入操作。

其實(shí)是因?yàn)閿?shù)據(jù)的寫(xiě)入操作(insert 、update)需要先獲取寫(xiě)鎖,由于可能產(chǎn)生幻讀的部分,已經(jīng)獲取到了某種鎖,所以要在另外一個(gè)會(huì)話中獲取寫(xiě)鎖的前提是當(dāng)前會(huì)話中釋放所有因加鎖語(yǔ)句產(chǎn)生的鎖。

mysql死鎖問(wèn)題

死鎖,就是產(chǎn)生了循環(huán)等待鏈條,我等待你的資源,你卻等待我的資源,我們都相互等待,誰(shuí)也不釋放自己占有的資源,導(dǎo)致無(wú)線等待下去。 
比如:  

  1. //Session A 
  2. START TRANSACTION
  3. UPDATE account SET p_money=p_money-100 WHERE p_name="tim"
  4. UPDATE account SET p_money=p_money+100 WHERE p_name="bill"
  5. COMMIT
  6. //Thread B 
  7. START TRANSACTION
  8. UPDATE account SET p_money=p_money+100 WHERE p_name="bill"
  9. UPDATE account SET p_money=p_money-100 WHERE p_name="tim"
  10. COMMIT 

當(dāng)線程A執(zhí)行到第一條語(yǔ)句UPDATE account SET p_money=p_money-100 WHERE p_name=”tim”;鎖定了p_name=”tim”的行數(shù)據(jù);并且試圖獲取p_name=”bill”的數(shù)據(jù);

,此時(shí),恰好,線程B也執(zhí)行到第一條語(yǔ)句:UPDATE account SET p_money=p_money+100 WHERE p_name=”bill”;

鎖定了 p_name=”bill”的數(shù)據(jù),同時(shí)試圖獲取p_name=”tim”的數(shù)據(jù); 
此時(shí),兩個(gè)線程就進(jìn)入了死鎖,誰(shuí)也無(wú)法獲取自己想要獲取的資源,進(jìn)入無(wú)線等待中,直到超時(shí)!

innodb_lock_wait_timeout 等待鎖超時(shí)回滾事務(wù): 
直觀方法是在兩個(gè)事務(wù)相互等待時(shí),當(dāng)一個(gè)等待時(shí)間超過(guò)設(shè)置的某一閥值時(shí),對(duì)其中一個(gè)事務(wù)進(jìn)行回滾,另一個(gè)事務(wù)就能繼續(xù)執(zhí)行。這種方法簡(jiǎn)單有效,在innodb中,參數(shù)innodb_lock_wait_timeout用來(lái)設(shè)置超時(shí)時(shí)間。

wait-for graph算法來(lái)主動(dòng)進(jìn)行死鎖檢測(cè): 
innodb還提供了wait-for graph算法來(lái)主動(dòng)進(jìn)行死鎖檢測(cè),每當(dāng)加鎖請(qǐng)求無(wú)法立即滿足需要并進(jìn)入等待時(shí),wait-for graph算法都會(huì)被觸發(fā)。

如何盡可能避免死鎖

1)以固定的順序訪問(wèn)表和行。比如兩個(gè)更新數(shù)據(jù)的事務(wù),事務(wù)A 更新數(shù)據(jù)的順序 為1,2;事務(wù)B更新數(shù)據(jù)的順序?yàn)?,1。這樣更可能會(huì)造成死鎖。

2)大事務(wù)拆小。大事務(wù)更傾向于死鎖,如果業(yè)務(wù)允許,將大事務(wù)拆小。

3)在同一個(gè)事務(wù)中,盡可能做到一次鎖定所需要的所有資源,減少死鎖概率。

4)降低隔離級(jí)別。如果業(yè)務(wù)允許,將隔離級(jí)別調(diào)低也是較好的選擇,比如將隔離級(jí)別從RR調(diào)整為RC,可以避免掉很多因?yàn)間ap鎖造成的死鎖。

5)為表添加合理的索引。可以看到如果不走索引將會(huì)為表的每一行記錄添加上鎖,死鎖的概率大大增大。

顯式鎖 與 隱式鎖 
隱式鎖:我們上文說(shuō)的鎖都屬于不需要額外語(yǔ)句加鎖的隱式鎖。 
顯示鎖: 

SELECT ... LOCK IN SHARE MODE(加共享鎖);
SELECT ... FOR UPDATE(加排他鎖); 

詳情上文已經(jīng)說(shuō)過(guò)。

通過(guò)如下sql可以查看等待鎖的情況  

  1. select * from information_schema.innodb_trx where trx_state="lock wait"

 或

  1. show engine innodb status; 

mysql中的事務(wù)  

  1. show variables like "autocommit"
  2.  
  3. set autocommit=0; //0表示AutoCommit關(guān)閉 
  4. set autocommit=1; //1表示AutoCommit開(kāi)啟  
  • 自動(dòng)提交(AutoCommit,mysql默認(rèn))

mysql默認(rèn)采用AutoCommit模式,也就是每個(gè)sql都是一個(gè)事務(wù),并不需要顯示的執(zhí)行事務(wù)。 

如果autoCommit關(guān)閉,那么每個(gè)sql都默認(rèn)開(kāi)啟一個(gè)事務(wù),只有顯式的執(zhí)行“commit”后這個(gè)事務(wù)才會(huì)被提交。 

責(zé)任編輯:龐桂玉 來(lái)源: Java團(tuán)長(zhǎng)
相關(guān)推薦

2020-09-23 10:00:26

Redis數(shù)據(jù)庫(kù)命令

2023-10-13 13:30:00

MySQL鎖機(jī)制

2023-12-08 07:40:07

并發(fā)控制

2021-03-10 10:55:51

SpringJava代碼

2021-07-26 07:47:37

無(wú)鎖編程CPU

2017-05-04 15:36:54

Openstack Q實(shí)現(xiàn)實(shí)踐

2022-07-04 08:01:01

鎖優(yōu)化Java虛擬機(jī)

2020-12-11 07:32:45

編程ThreadLocalJava

2020-11-13 08:42:24

Synchronize

2025-05-06 00:43:00

MySQL日志文件MIXED 3

2023-10-31 10:51:56

MySQLMVCC并發(fā)性

2022-08-22 08:04:25

Spring事務(wù)Atomicity

2022-10-12 07:53:46

并發(fā)編程同步工具

2024-05-10 08:18:16

分布式數(shù)據(jù)庫(kù)

2024-12-31 09:00:12

Java線程狀態(tài)

2019-07-24 16:04:47

Java虛擬機(jī)并發(fā)

2024-06-28 10:25:18

2016-12-08 15:36:59

HashMap數(shù)據(jù)結(jié)構(gòu)hash函數(shù)

2010-06-01 15:25:27

JavaCLASSPATH

2020-07-21 08:26:08

SpringSecurity過(guò)濾器
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

亚洲午夜日本在线观看| 久久精品网址| 亚洲国产一区自拍| 日本成人在线免费视频| 夜级特黄日本大片_在线| 国产精品一区二区久久不卡| 午夜精品一区二区三区在线播放 | 国产精品30p| 国产成人影院| 欧美sm美女调教| 爆乳熟妇一区二区三区霸乳| 2024最新电影免费在线观看 | 国产精品一区二区三区在线观| 日韩人妻精品中文字幕| 日本福利片在线观看| 欧美videosex性欧美黑吊| 久久综合av免费| 92国产精品久久久久首页| 麻豆久久久久久久久久| 欧美一区综合| www国产91| 91精品人妻一区二区三区蜜桃欧美 | 欧美色图五月天| 欧美一区二区三区免费大片 | 麻豆一区二区三区精品视频| 激情五月综合网| 亚洲二区中文字幕| 黄色一级片免费播放| 日韩美女在线看免费观看| 亚洲最新在线观看| 国产又爽又黄ai换脸| 日韩午夜电影网| 日本不卡视频一二三区| 欧美精品成人在线| 永久av免费网站| 中国av一区| 日韩成人xxxx| 男人网站在线观看| 亚洲午夜精品| 欧美福利电影网| 九九视频精品在线观看| 91精品无人成人www| 亚洲精品无码专区| 精品一区二区免费在线观看| 国产精品9999| 极品国产91在线网站| 国产日韩欧美一区| 97成人在线视频| 日韩免费观看一区二区| 午夜欧美精品| 色综合久久悠悠| 国产一区二区视频在线观看免费| 久久精品影视| 久久精品久久久久| 91精品国产闺蜜国产在线闺蜜| 成人写真视频| 最新69国产成人精品视频免费| 欧美偷拍一区二区三区| 久草在线成人| 亚洲性视频网址| 亚洲欧美va天堂人熟伦| 国产免费久久| www.亚洲成人| 欧美久久久久久久久久久久| 欧美日韩99| 久久久免费在线观看| 日本三级黄色大片| 亚洲一级片免费看| 日韩在线看片| 欧美成人激情视频免费观看| 特级片在线观看| 日韩视频二区| 国产精品扒开腿做爽爽爽男男| 18国产免费视频| 国内外成人在线视频| 成人欧美一区二区三区视频xxx| 国模无码一区二区三区| 久久综合色8888| 五月婷婷综合色| av在线导航| 午夜日韩在线电影| 狠狠躁狠狠躁视频专区| 精品中文字幕一区二区三区四区| 精品三级av在线| 国产精品亚洲无码| 亚洲精品二区三区| 91精品国产91久久久久久不卡| 国产一区二区视频网站| 精品一区二区三区香蕉蜜桃| αv一区二区三区| 国产一二三区在线视频| 亚洲欧美日本韩国| 亚洲美免无码中文字幕在线 | 91香蕉视频在线观看视频| h视频久久久| 中文字幕av一区二区三区谷原希美| 波多野结衣不卡视频| 麻豆久久精品| 粉嫩精品一区二区三区在线观看| 国产专区在线播放| 一区二区三区四区高清精品免费观看 | 欧美日韩一二三区| 国产性生活毛片| 久久在线免费| 日本一区二区在线免费播放| 99久久久国产精品无码网爆 | 精品粉嫩aⅴ一区二区三区四区 | 久久视频国产| 国产91精品久久久久久| av一区二区三| 亚洲国产精品激情在线观看| 波多野结衣综合网| 国产精品视频一区视频二区| 精品一区精品二区| 国产精品第一页在线观看| 久久国产人妖系列| 欧美aaaaa喷水| av伦理在线| 欧美一区日本一区韩国一区| 亚洲自拍偷拍图| 国产亚洲成人一区| 99三级在线| 成人无遮挡免费网站视频在线观看| 精品久久久一区| 农村末发育av片一区二区| 999国产精品| 国产精品无码专区在线观看| 理论视频在线| 日本高清成人免费播放| av无码一区二区三区| 欧美另类专区| 亚洲影视中文字幕| 黄色动漫在线| 制服丝袜中文字幕一区| 91久久久久久久久久久久久久| 日本中文一区二区三区| 欧美尤物一区| 播放一区二区| 亚洲天堂成人在线视频| 日韩免费av网站| 久久亚洲精精品中文字幕早川悠里| 成人午夜视频在线观看免费| 亚洲高清在线一区| 欧美激情第1页| 日韩在线视频第一页| 亚洲福利视频三区| 少妇一级淫片免费放播放| 黄色欧美日韩| 国产日韩欧美一区二区| caoporn视频在线| 日韩精品中文字幕在线观看| 国产免费观看av| 久久九九久精品国产免费直播| 熟妇人妻va精品中文字幕| 一区二区三区视频免费观看| 久久久久久久久网站| 亚洲一区二区影视| 国产精品丝袜久久久久久app| 亚洲精品高清无码视频| 精品一区二区三| 国产精品久久久av| 日本免费视频在线观看| 欧美久久久久免费| 欧美黄色aaa| 丁香婷婷深情五月亚洲| 97国产在线播放| 精品国产乱码| 91久久精品一区| 欧美6一10sex性hd| 日韩激情av在线免费观看| 国产情侣小视频| 亚洲免费三区一区二区| 亚洲 欧美 日韩在线| 久久久久在线| 久久久国产精华液999999| 91国内精品| 欧美影院久久久| 日韩黄色影院| 亚洲第一精品夜夜躁人人爽 | 91精品国产综合久久香蕉的用户体验 | 91精品中文字幕| 一区二区三区四区精品在线视频| 538国产视频| 久久精品国产久精国产爱| 国产欧美123| 九九精品在线| 亚洲xxx自由成熟| 黄色亚洲网站| 欧美巨猛xxxx猛交黑人97人| 日韩一区av| 日韩一区二区中文字幕| 91视频免费网址| 亚洲日本青草视频在线怡红院| 国产婷婷在线观看| 麻豆一区二区在线| www.日本在线播放| 亚洲综合专区| 日本不卡在线播放| 一区二区在线免费播放| 国产精品欧美一区二区三区奶水| 国产色婷婷在线| 久久精品电影一区二区| 亚洲欧洲精品视频| 日韩一区二区电影网| 91丨九色丨海角社区| 亚洲午夜精品在线| 登山的目的在线| 久久久久久电影| 又黄又爽的网站| 国产美女视频91| 五月婷婷丁香综合网| 一本一道久久综合狠狠老精东影业| 中文精品一区二区三区| 视频一区在线观看| 久久99精品久久久久久久青青日本 | 69视频在线| 亚洲欧美激情精品一区二区| 亚洲黄色在线播放| 欧美一区国产二区| 亚洲天堂免费av| 色欧美日韩亚洲| 在线观看中文字幕视频| 一区二区三区欧美激情| 国产免费嫩草影院| 中文字幕第一区| 免费福利视频网站| 国产亚洲欧美一区在线观看| 欧亚乱熟女一区二区在线| 国产suv精品一区二区三区| 免费网站在线观看黄| 秋霞电影一区二区| 手机在线看福利| 日韩—二三区免费观看av| 久久久久久久久久久福利| 一本久道久久综合婷婷鲸鱼| 国产精品久久久久9999爆乳| 欧美日本不卡| 在线观看污视频| 2023国产精品久久久精品双| 永久免费精品视频网站| 日韩伦理一区| 亚洲精品乱码久久久久久蜜桃91| jlzzjlzz亚洲女人| 亚洲午夜精品一区二区三区| 欧美韩日高清| 色香蕉在线观看| 中文字幕一区二区三区欧美日韩 | 青青国产91久久久久久| 久久久精品麻豆| 蜜臀av性久久久久蜜臀aⅴ| 999精彩视频| 狠狠色狠狠色综合日日91app| www.久久av.com| 国产在线日韩欧美| 久久精品无码一区二区三区毛片| 国产一区二区视频在线播放| 成人高清在线观看视频| 成人亚洲一区二区一| 手机在线成人av| 国产视频亚洲色图| 成年人视频软件| 夜夜爽夜夜爽精品视频| 日韩精品手机在线| 在线一区二区三区做爰视频网站| 国产99久久久久久免费看| 欧美美女黄视频| 亚洲欧美另类一区| 亚洲免费视频在线观看| 午夜视频在线免费观看| 欧美疯狂性受xxxxx另类| 交100部在线观看| 国产精品精品久久久久久| 91成人小视频| 国产一区在线免费观看| 国产日产精品一区二区三区四区的观看方式 | 97视频免费在线看| 色综合天天色| 超碰在线97av| 亚洲制服欧美另类| 自拍另类欧美| 亚洲资源av| 日韩av影视大全| 91免费国产视频网站| 少妇视频在线播放| 亚洲综合免费观看高清在线观看| 青青青国产在线| 日韩三级在线观看| 国产美女性感在线观看懂色av| 欧美成人免费网| 黑人巨大精品| 国产精品亚洲一区| 欧美日韩色图| 国产综合av在线| 国产一区二区三区四区五区入口| 国产高清成人久久| 国产精品高潮久久久久无| 日韩xxx高潮hd| 5858s免费视频成人| 青梅竹马是消防员在线| 欧美久久久精品| 欧美综合影院| 欧美中文娱乐网| 99精品国产一区二区青青牛奶| 第四色婷婷基地| 久久夜色精品一区| 久久免费视频精品| 666欧美在线视频| 粉嫩av在线播放| 欧美中文字幕视频| 91精品久久久久久综合五月天| 亚洲国产精品一区在线观看不卡| 亚洲国产日本| 国产老头和老头xxxx×| 中文字幕一区二区在线观看| 五月天婷婷激情| 精品福利视频一区二区三区| 哥也色在线视频| 国产精品视频一区国模私拍| 亚洲素人在线| 国产中文字幕视频在线观看| 国产不卡一区视频| 天天天天天天天天操| 欧美精品久久99| 91精品专区| 国产精品视频最多的网站| 国产va免费精品观看精品视频| 日本国产在线播放| 成人av免费观看| 五月天婷婷丁香| 精品国精品国产| 黄色的视频在线观看| 亚洲自拍偷拍色图| 2023国产精品久久久精品双| 特黄视频免费观看| 亚洲国产精品二十页| 自拍偷拍校园春色| 亚洲色图av在线| 欧美人体一区二区三区| 欧美日韩在线精品| 国产激情在线免费观看| 亚洲天堂视频在线播放| 日韩一区二区三区三四区视频在线观看 | 国产一区二区三区免费播放| 男女全黄做爰文章| 欧美精品在线视频| 动漫一区在线| 亚洲新声在线观看| 无码久久精品国产亚洲av影片| 午夜精品一区二区三| 永久555www成人免费| 亚洲精品粉嫩美女一区| 日本不卡免费新一二三区| 日韩黄色在线观看| www.4hu95.com四虎| 欧美男生操女生| 好操啊在线观看免费视频| 亚洲影院色在线观看免费| 欧美日韩影院| 污污污www精品国产网站| 疯狂做受xxxx欧美肥白少妇| 美州a亚洲一视本频v色道| 国产精品com| 亚洲色图网站| 欧美极品少妇无套实战| 国产成人午夜精品5599| 国产午夜久久久| 日韩精品亚洲视频| 成人黄色毛片| 超薄肉色丝袜足j调教99| 高清国产一区二区三区| 成人精品在线看| 最近2019免费中文字幕视频三| 97久久中文字幕| 婷婷无套内射影院| 国产清纯在线一区二区www| 欧美性视频在线播放| 日韩成人一区| 野外做受又硬又粗又大视频√| proumb性欧美在线观看| 最近国语视频在线观看免费播放| 久久亚洲电影天堂| 玖玖玖免费嫩草在线影院一区| 狠狠操精品视频| 樱花草国产18久久久久| 你懂的免费在线观看| 亚洲va久久久噜噜噜| 国产精品普通话对白| 国产又粗又猛又爽又黄的视频小说| 精品毛片乱码1区2区3区| 日韩毛片免费观看| 久久www视频| 日本一区二区久久| 日韩中文字幕影院| 国产日本欧美一区二区三区在线| 红桃视频亚洲| 51精品免费网站| 亚洲毛片在线看| 成人激情自拍| 五月天国产视频| 91福利视频网站|