mysql有物件鎖 MySQL 有關鎖的簡單介紹

2021-10-18 07:29:02 字數 3737 閱讀 5213

一、latch & lock

在資料庫中 latch & lock 都可以被稱為鎖,但兩者有著截然不同的意義。

latch 一般被稱為閂鎖(輕量級的鎖),鎖定的時間很短,若持續的時間長,則應用的效能會非常差。

在 innodb 中 latch 鎖又可以分為 mutex (互斥量) 和 rwlock (讀寫鎖)。其主要目的是用來保證併發執行緒操作臨界資源的正確性,並且沒有死鎖檢測機制。

## latch 是乙個非常透明的東西,一般除了非常底層的資料庫人員很難看懂

## show engine innodb mutex;

lock 的物件是事務,用來鎖定的資料庫中的物件,如表,頁,行。一般 lock 的物件僅在事務 commit 或rollback 後進行釋放(不同事務隔離級別釋放的時間可能不同)。lock 與 latch 不同的是 lock 有死鎖檢測機制的。

二、innodb 儲存引擎中的鎖

一、innodb 儲存引擎中的鎖:

s 行級共享鎖:允許事務讀一行資料;lock in share mode。

x 行級排他鎖 :  允許事務更新或刪除一行資料;增刪改產生排它鎖,還有乙個比較特殊 select ... for update。

is : 意向鎖

ix : 意向排他鎖

ai : 自增鎖,ai 自增鎖 ,自增鎖是用來做自增的併發控制的。

二、鎖之間的相容性

鎖相容(lock compatible): 如果事務t1 獲得行 r 的共享鎖,那麼另外的事務 t2 可以立即獲得行 r 的共享鎖,因為讀取並沒有改變行 r 的資料。

鎖不相容: 若有其他的事務 t3 想獲得行 r 的排他鎖,則必須等待事務 t1、t2 釋放行 r 上的共享鎖。

表 1-1 排它鎖和共享鎖的相容性

從表1-1 可以看出 ,x鎖與任何的鎖都不相容,而 s 鎖僅和 s 鎖相容。s 鎖 和 x 鎖都是行鎖 ,相容是指對同一記錄(row)鎖的相容情況。

意向鎖: 用來實現多粒度級別的鎖的。

揭示下一層級請求的鎖型別。

is : 事務想要獲得一張表中某幾行的共享鎖

ix : 事務想要獲得一張表中某幾行的排它鎖

innodb 中意向鎖都是表鎖(簡單的這樣理解下)

資料庫總共有表鎖,頁鎖,記錄鎖,但是在 mysql 中只有表鎖跟記錄鎖,意向鎖都是加在表上的。

意向鎖之間都是相容的,用來揭示下一層級的鎖。

表 1-2 innodb 儲存引擎中鎖的相容性

三、檢視鎖物件內容

使用 show engine innodb status

(root@localhost) [(none)]> pager less

pager set to 'less'

(root@localhost) [(none)]>

(root@localhost) [(none)]> show engine innodb status \g

transactions

如果想檢視比較詳細的鎖的資訊,可通過開啟 innodb_status_output_locks

(root@localhost) [test]> set global innodb_status_output_locks=1;

query ok,0 rows affected (0.00sec)

(root@localhost) [test]> show variables like '%innodb_status_output%';+----------------------------+-------+

| variable_name | value |

| innodb_status_output | off |

| innodb_status_output_locks | on |

2 rows in set (0.00 sec)

如下是開啟 innodb_status_output ,show engine innodb status 輸出的詳細資訊:

找到 transactions , heap_no 2,3,4 表示的是插入的順序,其中包含兩個隱藏列, len 6 是指標列,len 7 是什麼列來著忘了

在 show engine innodb status 中的 thread_id 對應的是 show processlist 中 processlist_id 。

這樣看有點麻煩,可以借助 information_schema 中的幾張表,innodb_trx,innodb_locks,innodb_lock_waits

在 5.7 版本中有一張 innodb_lock_waits

(root@localhost) [sys]> select * frominnodb_lock_waits\g*************************** 1. row ***************************wait_started:2019-02-28 16:26:18wait_age:00:00:18wait_age_secs:18locked_table: `test`.`lock_1`

locked_index:primarylocked_type: record

waiting_trx_id:260217waiting_trx_started:2019-02-28 16:26:18waiting_trx_age:00:00:18waiting_trx_rows_locked:1waiting_trx_rows_modified:0waiting_pid:18waiting_query:update lock_1 set b=6 where a=4waiting_lock_id:260217:217:3:3waiting_lock_mode: x

blocking_trx_id:260213blocking_pid:19blocking_query:nullblocking_lock_id:260213:217:3:3blocking_lock_mode: x

blocking_trx_started:2019-02-28 16:11:46blocking_trx_age:00:14:50blocking_trx_rows_locked:1blocking_trx_rows_modified:0sql_kill_blocking_query:kill query 19sql_kill_blocking_connection:kill 19

1 row in set, 3 warnings (0.00 sec)

# kill query :表示殺掉查詢,

# kill 表示這個連線也殺掉

四、ai 自增鎖

mysql 的自增存在乙個回溯問題,簡單說 mysql 的自增是不持久化的。當資料庫被異常重啟 可以通過 select max(auto_inc_col)from t for update;

重新獲得表的自增起始id 值,這個可能會造成 id 衝突。

自增鎖在提交完成之後就已經被釋放了。所以自增鎖持有的時間是sql的執行時間。假如你插入的是乙個大事務的話就會出現阻塞了。

而x,ix 等是需要commit 之後才能釋放的。

設定 innodb_autoinc_lock_mode=2 // 每一條記錄加鎖釋放,這個提高了併發能力,但是可能出現一條語句中的資料不連續了。

mysql資料鎖 mysql資料庫鎖有哪些

mysql資料庫中的鎖有 1 共享鎖,表示對資料進行讀操作 2 排他鎖,表示對資料進行寫操作 3 行鎖,對一行記錄加鎖,只影響一條記錄 4 意向鎖,為了在乙個事務中揭示下一行將要被請求鎖的型別。mysql資料庫鎖 1 共享鎖 shared lock,也叫s鎖 共享鎖 s 表示對資料進行讀操作。因此多...

mysql鎖機制有哪些6 mysql鎖機制 六

快照讀 簡單的select操作,沒有lock in share mode或for update,快照讀不會加任何的鎖,而且由於mysql的一致性非鎖定讀的機制存在,任何快照讀也不會被阻塞。但是如果事務的隔離級別是serializable的話,那麼快照讀也會被加上共享的next key鎖,本文不對se...

mysql鎖是什麼意思 mysql鎖有什麼用?

mysql鎖有什麼用?2020 06 30 22 02 29 mysql鎖的用處 1 共享鎖時,其他使用者能讀,不能改變量表資料,只對本人產生影響 2 排它鎖時,其他使用者既不能讀,也不能改表資料 3 保證資料的原子性,完整性,一致性。mysql鎖的用處 簡單說,就是lock table,不讓別人動...