溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

mysql學(xué)習(xí)13:第八章:鎖

發(fā)布時(shí)間:2020-08-10 17:22:07 來源:ITPUB博客 閱讀:196 作者:studywell 欄目:MySQL數(shù)據(jù)庫(kù)

 

1.  

InnoDB支持行鎖,有時(shí)升級(jí)為表鎖。

MyISAM只支持表鎖。

表鎖:開小小,加鎖快,不會(huì)出現(xiàn)死鎖;鎖粒度大,鎖沖突概率高,并發(fā)度低。

行鎖:開銷大,加鎖慢,會(huì)出現(xiàn)死鎖,鎖粒度小,鎖沖突概率低,并發(fā)高。

1.1.   InnoDB鎖類型

主要分為:讀鎖(共享鎖),寫鎖(排他鎖),意向鎖,和MDL鎖。

1.1.1.   讀鎖

讀鎖,S鎖,一個(gè)事物在讀取一個(gè)數(shù)據(jù)行時(shí),其他事務(wù)也可以讀,但不能對(duì)該數(shù)據(jù)行增刪改的操作。兩種select方式的應(yīng)用。

l   自動(dòng)提交模式下的select查詢語(yǔ)句,不需加任何鎖返回結(jié)果,是一致性非鎖定讀。

l   通過select....lock in share mode在被讀取的行記錄或行記錄的范圍上加一個(gè)讀鎖,讓其他事務(wù)可讀不可申請(qǐng)加寫鎖。

1.1.2.   寫鎖

寫鎖簡(jiǎn)稱X鎖,一個(gè)事務(wù)獲取一行的寫鎖,其他事務(wù)就不能獲取該行其它鎖,優(yōu)先級(jí)最高。

select for update,會(huì)對(duì)讀取的行記錄上加一個(gè)寫鎖,其他任何事務(wù)就不能加任何鎖。

1.1.3.   MDL鎖

mysql5.5引入meta data lock,簡(jiǎn)稱MDL鎖,用于保護(hù)表中元數(shù)據(jù)的信息。即一個(gè)事務(wù)查詢表將自動(dòng)給表加MDL鎖,其他事務(wù)不能做任何DDL操作。

1.1.4.   意向鎖

InnoDB引擎中,意向鎖是表級(jí)鎖,作用和MDL類似,防止事務(wù)進(jìn)行過程中,執(zhí)行DDL語(yǔ)句的操作而導(dǎo)致數(shù)據(jù)不一致。有兩種意向鎖類型:

l   意向共享鎖(IS):數(shù)據(jù)行加共享鎖前必須先取得該表的IS鎖。

l   意向排他鎖(IX):數(shù)據(jù)行加排他鎖前必須先取得該表的IX鎖。

1.2.   InnoDB行鎖種類

InnoDB默認(rèn)事務(wù)隔離級(jí)別為RR,且參數(shù)innodb_locks_unsafe_for_binlog=0的模式下,行鎖有三種。

l   單個(gè)行記錄的鎖(record lock),主鍵和唯一索引都是。

l   間隙鎖(GAP lock)

l   記錄鎖和間隙鎖的組合叫next-key lock。普通索引默認(rèn)。

1.2.1.   單個(gè)行記錄的鎖

InnoDB上的行鎖就是加在索引上。有索引,更新只鎖指定行,無索引,更新鎖所有行。

1.2.2.   間隙鎖(GAP lock)

RR隔離級(jí)別,為了避免幻讀,引入Gap lock,只鎖定行記錄數(shù)據(jù)的范圍,不包含記錄本身,即不允許在此范圍內(nèi)插入任何數(shù)據(jù)。

RC隔離級(jí)別允許出現(xiàn)幻讀現(xiàn)象。

1.2.3.   Next-Key Locks

Next-key lock是記錄鎖(Record Lock)與間隔鎖(Gap Lock)的組合,當(dāng)InnoDB掃描索引記錄時(shí),會(huì)先對(duì)選中的索引記錄加上記錄鎖(Record lock),再對(duì)索引記錄兩邊的間隙加上間隙鎖(Gap lock)。

1.3.   鎖等待和死鎖

鎖等待,是一個(gè)事務(wù)產(chǎn)生鎖,其他事務(wù)等待上個(gè)事務(wù)釋放它的鎖。鎖等待超時(shí)閾值innodb_lok_wait_timeout控制,單位秒。

死鎖,多個(gè)事務(wù)爭(zhēng)奪資源相互等待的現(xiàn)象,即鎖資源請(qǐng)求產(chǎn)生了回路,就是死循環(huán)。

避免死鎖的方法:

l   如不同的程序會(huì)并發(fā)存取多個(gè)表,或涉及多汗記錄,盡量約定以相同的順序訪問表。

l   業(yè)務(wù)中盡量采用小事務(wù),避免大事務(wù),及時(shí)提交或回滾。

l   在同一個(gè)事務(wù)中,盡可能做到一次鎖定所需的所有資源。

l   對(duì)容易產(chǎn)生死鎖的業(yè)務(wù),可以嘗試使用升級(jí)鎖粒度,通過表鎖定減少鎖產(chǎn)生的概率。

 

通過show engine innodb sttus查看死鎖展示信息 。

[(none)]>show engine innodb status;

 

| Type   | Name | Status

 

| InnoDB |      |

=====================================

2018-11-07 22:49:40 0x7f1320202700 INNODB MONITOR OUTPUT

=====================================

Per second averages calculated from the last 11 seconds

-----------------

BACKGROUND THREAD

-----------------

srv_master_thread loops: 98 srv_active, 0 srv_shutdown, 49465 srv_idle

srv_master_thread log flush and writes: 49563

----------

SEMAPHORES

----------

OS WAIT ARRAY INFO: reservation count 20

OS WAIT ARRAY INFO: signal count 20

RW-shared spins 0, rounds 34, OS waits 16

RW-excl spins 0, rounds 200, OS waits 2

RW-sx spins 0, rounds 0, OS waits 0

Spin rounds per wait: 34.00 RW-shared, 200.00 RW-excl, 0.00 RW-sx

------------

TRANSACTIONS

------------

Trx id counter 65440

Purge done for trx's n:o < 65438 undo n:o < 0 state: running but idle

History list length 12

LIST OF TRANSACTIONS FOR EACH SESSION:

---TRANSACTION 421197684710112, not started

0 lock struct(s), heap size 1136, 0 row lock(s)

---TRANSACTION 421197684709200, not started

0 lock struct(s), heap size 1136, 0 row lock(s)

--------

FILE I/O

--------

I/O thread 0 state: waiting for completed aio requests (insert buffer thread)

I/O thread 1 state: waiting for completed aio requests (log thread)

I/O thread 2 state: waiting for completed aio requests (read thread)

I/O thread 3 state: waiting for completed aio requests (read thread)

I/O thread 4 state: waiting for completed aio requests (read thread)

I/O thread 5 state: waiting for completed aio requests (read thread)

I/O thread 6 state: waiting for completed aio requests (read thread)

I/O thread 7 state: waiting for completed aio requests (read thread)

I/O thread 8 state: waiting for completed aio requests (read thread)

I/O thread 9 state: waiting for completed aio requests (read thread)

I/O thread 10 state: waiting for completed aio requests (write thread)

I/O thread 11 state: waiting for completed aio requests (write thread)

I/O thread 12 state: waiting for completed aio requests (write thread)

I/O thread 13 state: waiting for completed aio requests (write thread)

I/O thread 14 state: waiting for completed aio requests (write thread)

I/O thread 15 state: waiting for completed aio requests (write thread)

I/O thread 16 state: waiting for completed aio requests (write thread)

I/O thread 17 state: waiting for completed aio requests (write thread)

Pending normal aio reads: [0, 0, 0, 0, 0, 0, 0, 0] , aio writes: [0, 0, 0, 0, 0, 0, 0, 0] ,

 ibuf aio reads:, log i/o's:, sync i/o's:

Pending flushes (fsync) log: 0; buffer pool: 0

271 OS file reads, 61118 OS file writes, 60451 OS fsyncs

0.00 reads/s, 0 avg bytes/read, 0.00 writes/s, 0.00 fsyncs/s

-------------------------------------

INSERT BUFFER AND ADAPTIVE HASH INDEX

-------------------------------------

Ibuf: size 1, free list len 0, seg size 2, 0 merges

merged operations:

 insert 0, delete mark 0, delete 0

discarded operations:

 insert 0, delete mark 0, delete 0

Hash table size 553193, node heap has 0 buffer(s)

Hash table size 553193, node heap has 0 buffer(s)

Hash table size 553193, node heap has 0 buffer(s)

Hash table size 553193, node heap has 0 buffer(s)

Hash table size 553193, node heap has 0 buffer(s)

Hash table size 553193, node heap has 1 buffer(s)

Hash table size 553193, node heap has 0 buffer(s)

Hash table size 553193, node heap has 0 buffer(s)

0.00 hash searches/s, 0.00 non-hash searches/s

---

LOG

---

Log sequence number 20357616

Log flushed up to   20357616

Pages flushed up to 20357616

Last checkpoint at  20357607

0 pending log flushes, 0 pending chkp writes

60048 log i/o's done, 0.00 log i/o's/second

----------------------

BUFFER POOL AND MEMORY

----------------------

Total large memory allocated 2198863872

Dictionary memory allocated 156387

Buffer pool size   131056

Free buffers       130465

Database pages     590

Old database pages 0

Modified db pages  0

Pending reads      0

Pending writes: LRU 0, flush list 0, single page 0

Pages made young 0, not young 0

0.00 youngs/s, 0.00 non-youngs/s

Pages read 238, created 352, written 805

0.00 reads/s, 0.00 creates/s, 0.00 writes/s

No buffer pool page gets since the last printout

Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s

LRU len: 590, unzip_LRU len: 0

I/O sum[0]:cur[0], unzip sum[0]:cur[0]

----------------------

INDIVIDUAL BUFFER POOL INFO

----------------------

---BUFFER POOL 0

Buffer pool size   16382

Free buffers       16279

Database pages     102

Old database pages 0

Modified db pages  0

Pending reads      0

Pending writes: LRU 0, flush list 0, single page 0

Pages made young 0, not young 0

0.00 youngs/s, 0.00 non-youngs/s

Pages read 38, created 64, written 95

0.00 reads/s, 0.00 creates/s, 0.00 writes/s

No buffer pool page gets since the last printout

Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s

LRU len: 102, unzip_LRU len: 0

I/O sum[0]:cur[0], unzip sum[0]:cur[0]

---BUFFER POOL 1

Buffer pool size   16382

Free buffers       16312

Database pages     70

Old database pages 0

Modified db pages  0

Pending reads      0

Pending writes: LRU 0, flush list 0, single page 0

Pages made young 0, not young 0

0.00 youngs/s, 0.00 non-youngs/s

Pages read 6, created 64, written 64

0.00 reads/s, 0.00 creates/s, 0.00 writes/s

No buffer pool page gets since the last printout

Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s

LRU len: 70, unzip_LRU len: 0

I/O sum[0]:cur[0], unzip sum[0]:cur[0]

---BUFFER POOL 2

Buffer pool size   16382

Free buffers       16319

Database pages     63

Old database pages 0

Modified db pages  0

Pending reads      0

Pending writes: LRU 0, flush list 0, single page 0

Pages made young 0, not young 0

0.00 youngs/s, 0.00 non-youngs/s

Pages read 8, created 55, written 56

0.00 reads/s, 0.00 creates/s, 0.00 writes/s

No buffer pool page gets since the last printout

Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s

LRU len: 63, unzip_LRU len: 0

I/O sum[0]:cur[0], unzip sum[0]:cur[0]

---BUFFER POOL 3

Buffer pool size   16382

Free buffers       16303

Database pages     79

Old database pages 0

Modified db pages  0

Pending reads      0

Pending writes: LRU 0, flush list 0, single page 0

Pages made young 0, not young 0

0.00 youngs/s, 0.00 non-youngs/s

Pages read 73, created 6, written 59

0.00 reads/s, 0.00 creates/s, 0.00 writes/s

No buffer pool page gets since the last printout

Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s

LRU len: 79, unzip_LRU len: 0

I/O sum[0]:cur[0], unzip sum[0]:cur[0]

---BUFFER POOL 4

Buffer pool size   16382

Free buffers       16265

Database pages     117

Old database pages 0

Modified db pages  0

Pending reads      0

Pending writes: LRU 0, flush list 0, single page 0

Pages made young 0, not young 0

0.00 youngs/s, 0.00 non-youngs/s

Pages read 76, created 41, written 120

0.00 reads/s, 0.00 creates/s, 0.00 writes/s

No buffer pool page gets since the last printout

Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s

LRU len: 117, unzip_LRU len: 0

I/O sum[0]:cur[0], unzip sum[0]:cur[0]

---BUFFER POOL 5

Buffer pool size   16382

Free buffers       16307

Database pages     75

Old database pages 0

Modified db pages  0

Pending reads      0

Pending writes: LRU 0, flush list 0, single page 0

Pages made young 0, not young 0

0.00 youngs/s, 0.00 non-youngs/s

Pages read 11, created 64, written 91

0.00 reads/s, 0.00 creates/s, 0.00 writes/s

No buffer pool page gets since the last printout

Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s

LRU len: 75, unzip_LRU len: 0

I/O sum[0]:cur[0], unzip sum[0]:cur[0]

---BUFFER POOL 6

Buffer pool size   16382

Free buffers       16363

Database pages     19

Old database pages 0

Modified db pages  0

Pending reads      0

Pending writes: LRU 0, flush list 0, single page 0

Pages made young 0, not young 0

0.00 youngs/s, 0.00 non-youngs/s

Pages read 13, created 6, written 12

0.00 reads/s, 0.00 creates/s, 0.00 writes/s

No buffer pool page gets since the last printout

Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s

LRU len: 19, unzip_LRU len: 0

I/O sum[0]:cur[0], unzip sum[0]:cur[0]

---BUFFER POOL 7

Buffer pool size   16382

Free buffers       16317

Database pages     65

Old database pages 0

Modified db pages  0

Pending reads      0

Pending writes: LRU 0, flush list 0, single page 0

Pages made young 0, not young 0

0.00 youngs/s, 0.00 non-youngs/s

Pages read 13, created 52, written 308

0.00 reads/s, 0.00 creates/s, 0.00 writes/s

No buffer pool page gets since the last printout

Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s

LRU len: 65, unzip_LRU len: 0

I/O sum[0]:cur[0], unzip sum[0]:cur[0]

--------------

ROW OPERATIONS

--------------

0 queries inside InnoDB, 0 queries in queue

0 read views open inside InnoDB

Process ID=21556, Main thread ID=139720374998784, state: sleeping

Number of rows inserted 60824, updated 0, deleted 0, read 121836

0.00 inserts/s, 0.00 updates/s, 0.00 deletes/s, 0.00 reads/s

----------------------------

END OF INNODB MONITOR OUTPUT

============================

 

1.4.   鎖問題的監(jiān)控

通過show full processlist和show engine Innodb status來判斷事務(wù)中鎖問題情況,另外還有三張表可查:

information_schema.INNODB_TRX

information_schema.INNODB_LOCKS

information_schema.INNODB_LOCK_WAITS

 

innodb_trx表部分字段

trx_id唯一的事務(wù)id號(hào);

trx_state:事務(wù)狀態(tài);

trx_wait_started:事務(wù)開始等待時(shí)間。

trx_mysql_thread_id:線程ID,與show full processlist相互對(duì)應(yīng)。

trx_query:事務(wù)運(yùn)行的SQL;

trx_operation_state:事務(wù)運(yùn)行的狀態(tài)。

 

[(none)]>show full processlist;

+----+------+-----------+------+---------+------+----------+-----------------------+

| Id | User | Host      | db   | Command | Time | State    | Info                  |

+----+------+-----------+------+---------+------+----------+-----------------------+

| 57 | root | localhost | NULL | Query   |    0 | starting | show full processlist |

+----+------+-----------+------+---------+------+----------+-----------------------+


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI