mysql 儲存過程 行鎖 mysql行鎖和表鎖

2021-10-18 20:59:35 字數 1637 閱讀 9311

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

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..

分享到:

2012-03-01 09:12

瀏覽 15930

分類:資料庫

oracle 儲存過程 行鎖

問題 1.要求通過儲存過程實現程式執行的併發控制。2.儲存過程乙個輸入引數乙個輸出引數,輸入要執行的程式名稱,判斷該程式是否在執行輸出引數返回程式狀態 3.解決問題 當兩個使用者同時訪問同一程式時,都檢索到該程式未執行,同時執行,併發失效。create or replace procedure pr...

Mysq 儲存過程

drop procedure if exists xl 建立儲存過程 delimiter 轉譯字元 使用 代替 create procedure xl begin select from fd car report end delimiter 轉譯字元 使用 代替 call xl 呼叫儲存過程 de...

mysql 行鎖 訂票 mysql 行鎖

在電子商務裡,經常會出現庫存數量少,購買的人又特別多,大併發情況下如何確保商品數量不會被多次購買.其實很簡單,利用事務 for update就可以解決.我們都知道for update實際上是共享鎖,是可以被讀取的.但是如何在執行時,不被讀取呢.簡單來說 假設現在庫存為1,現在有a和b同時購買 先開啟...