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