mysql行鎖和表鎖

2021-06-18 17:50:10 字數 2032 閱讀 8611

在呼叫儲存過程中,就會涉及到表鎖,行鎖這一概念:所謂區別:有索引的時候就是行鎖,沒有索引的時候就是表索。

innodb 的行鎖是在有索引的情況下,沒有索引的表是鎖定全表的.

表鎖演示(無索引)

session1:

mysql> set autocommit=0;

mysql> select * from innodb_test;

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

| id   | name        |

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

|    1 | woshiceshi  | 

|    2 | woshiceshi2 | 

|    3 | woshiceshi3 | 

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

mysql> select * from innodb_test where id = 2 for update;

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

| id   | name       |

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

|    2 | woshiceshi2 | 

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

session2:

mysql> update innodb_test set name='sjis' where id = 1 ;

處於等待狀態....

再回到session1 commit以後,session2就出來結果了(鎖定了8秒,過了8秒左右才去session1提交)。

mysql> update innodb_test set name='sjis' where id = 1 ;

query ok, 1 row affected (8.11 sec)

rows matched: 1  changed: 1  warnings: 0

實驗結果是:我在session1的for update 操作看似只鎖定id為2的行其實鎖定了全表,以至於後面session2的對id為1的行update 需要等待session1鎖的釋放。

行鎖演示(索引為id)

session1:

mysql> alter table innodb_test add index idx_id(id);

query ok, 4 rows affected (0.01 sec)

records: 4  duplicates: 0  warnings: 0

mysql> select * from innodb_test where id = 2 for update;

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

| id   | name       |

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

|    2 | woshiceshi2 | 

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

session2:

mysql> update innodb_test set name='wohaishiceshi' where id = 1 ;

query ok, 1 row affected (0.02 sec)

rows matched: 1  changed: 1  warnings: 0

mysql> select * from innodb_test where id = 1;           

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

| id   | name          |

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

|    1 | wohaishiceshi | 

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

1 row in set (0.00 sec)

實驗結果:這次的鎖定是鎖定的行,所以沒有被鎖定的行(id不為2的行)可以進行update..

mysql行鎖表鎖區別 mysql表鎖和行鎖區別

一 表鎖 特點 偏向myisam儲存引擎,開銷小,加鎖快 無死鎖 鎖定粒度大,發生鎖衝突的概率最高,併發度最低。我們在編輯表,或者執行修改表的事情了語句的時候,一般都會給表加上表鎖,可以避免一些不同步的事情出現,表鎖分為兩種,一種是讀鎖,一種是寫鎖。我們可以手動給表加上這兩種鎖,語句是 lock t...

mysql行鎖和表鎖

在呼叫儲存過程中,就會涉及到表鎖,行鎖這一概念 所謂區別 有索引的時候就是行鎖,沒有索引的時候就是表索。innodb 的行鎖是在有索引的情況下,沒有索引的表是鎖定全表的.表鎖演示 無索引 session1 mysql set autocommit 0 mysql select from innodb...

mysql行鎖和表鎖

myisam和inner db都支援表鎖,分為讀鎖和寫鎖 表共享讀鎖 table read lock 和表獨佔寫鎖 table write lock 就是說對myisam表進行讀操作時,它不會阻塞其他使用者對同一表的讀請求,但會阻塞 對同一表的寫操作 而對myisam表的寫操作,則會阻塞其他使用者對...