[MySQL] SELECT ... FOR UPDATE 的 Row Lock 與 Table Lock
2010-02-28 22:43
441 查看
转自:http://www.neo.com.tw/archives/900
先前介紹過 SELECT ... FOR UPDATE 的用法,不過鎖定(Lock)的資料是判別就得要注意一下了。由於 InnoDB 預設是 Row-Level Lock,所以只有「明確」的指定主鍵(tenfy:不一定需要主键,是索引就ok,并且跟给字段的值的分布也有关系),MySQL 才會執行 Row lock (只鎖住被選取的資料例) ,否則 MySQL 將會執行 Table Lock (將整個資料表單給鎖住)。
舉個例子:
假設有個表單 products ,裡面有 id 跟 name 二個欄位,id 是主鍵。
例1: (明確指定主鍵,並且有此筆資料,row lock)
SELECT * FROM products WHERE id='3' FOR UPDATE;
例2: (明確指定主鍵,若查無此筆資料,無 lock)
SELECT * FROM products WHERE id='-1' FOR UPDATE;
例2: (無主鍵,table lock)
SELECT * FROM products WHERE name='Mouse' FOR UPDATE;
例3: (主鍵不明確,table lock)
SELECT * FROM products WHERE id<>'3' FOR UPDATE;
例4: (主鍵不明確,table lock)
SELECT * FROM products WHERE id LIKE '3' FOR UPDATE;
註1:
FOR UPDATE 僅適用於 InnoDB,且必須在交易區塊(BEGIN/COMMIT)中才能生效。
註2:
要測試鎖定的狀況,可以利用 MySQL 的 Command Mode ,開二個視窗來做測試。
先前介紹過 SELECT ... FOR UPDATE 的用法,不過鎖定(Lock)的資料是判別就得要注意一下了。由於 InnoDB 預設是 Row-Level Lock,所以只有「明確」的指定主鍵(tenfy:不一定需要主键,是索引就ok,并且跟给字段的值的分布也有关系),MySQL 才會執行 Row lock (只鎖住被選取的資料例) ,否則 MySQL 將會執行 Table Lock (將整個資料表單給鎖住)。
舉個例子:
假設有個表單 products ,裡面有 id 跟 name 二個欄位,id 是主鍵。
例1: (明確指定主鍵,並且有此筆資料,row lock)
SELECT * FROM products WHERE id='3' FOR UPDATE;
例2: (明確指定主鍵,若查無此筆資料,無 lock)
SELECT * FROM products WHERE id='-1' FOR UPDATE;
例2: (無主鍵,table lock)
SELECT * FROM products WHERE name='Mouse' FOR UPDATE;
例3: (主鍵不明確,table lock)
SELECT * FROM products WHERE id<>'3' FOR UPDATE;
例4: (主鍵不明確,table lock)
SELECT * FROM products WHERE id LIKE '3' FOR UPDATE;
註1:
FOR UPDATE 僅適用於 InnoDB,且必須在交易區塊(BEGIN/COMMIT)中才能生效。
註2:
要測試鎖定的狀況,可以利用 MySQL 的 Command Mode ,開二個視窗來做測試。
相关文章推荐
- 【MySQL】select for update 的Row Lock 与Table Lock
- mysql lock in share mode 和 select for update
- mysql的行锁与表锁。(select* .... FOR UPDATE)
- MySQL update && select ,update的同时select,和for update 语句说再见。
- Mysql查询语句使用select.. for update导致的数据库死锁分析
- mysql SELECT FOR UPDATE语句使用示例
- MYSQL SELECT FOR UPDATE
- MySQL SELECT FOR UPDATE语句使用示例
- Mysql查询语句使用select.. for update导致的数据库死锁分析
- MySQL中的行级锁SELECT FOR UPDATE 和LOCK IN SHARE MODE 区别
- MySQL行级锁SELECT FOR UPDATE 和LOCK IN SHARE MODE区别
- 从 select ... for update来分析mysql的锁
- mysql的事务和select...for update
- mysql事务,select for update,及数据的一致性处理
- mysql-select for update
- mysql事务,select for update,及数据的一致性处理
- mysql SELECT FOR UPDATE语句使用示例
- MySQL SELECT ... FOR UPDATE
- Mysql加锁过程详解(4)-select for update/lock in share mode 对事务并发性影响
- MySQL中的行级锁SELECT FOR UPDATE 和LOCK IN SHARE MODE 区别