使用者工具

網站工具


database:mysql:locktable

差異處

這裏顯示兩個版本的差異處。

連向這個比對檢視

Both sides previous revision 前次修改
下次修改
前次修改
database:mysql:locktable [2014/01/11 08:16]
ali88
database:mysql:locktable [2014/01/11 14:49] (目前版本)
ali88
行 1: 行 1:
 ======MySQL鎖定 Lock Tables====== ======MySQL鎖定 Lock Tables======
-MySQL本身服務提供鎖定的方法是 表鎖**Tables Lock**,​對資料庫資源開銷較小。**Tables Lock**可以作用於不同儲存引擎(MyISAM,​Merge,​InnoDB,​BDB等),​但是其中Innodb儲存引擎有支援Rows Lock及交易等較好機制,​**Tables Lock**比較不常作用於Innodb上+MySQL本身服務提供鎖定的方法是 表鎖**Tables Lock**,​對資料庫資源開銷較小。**Tables Lock**可以作用於不同儲存引擎(MyISAM,​Merge,​InnoDB,​BDB等),​但是其中Innodb儲存引擎有支援**Rows Lock**及交易等較好機制,​**Tables Lock**比較不常作用於Innodb上,​另外,​許多文件上指出,​既然Innodb儲存引擎已經實現**Rows Lock**很好機制,​就沒必要使用**Tables Lock**。 
 +總結一下:​ 
 +  * MySQL支援的表鎖**Tables Lock**是由服務器提供,​而不是儲存引擎。常應用於MyISAM儲存引擎(支援Table Lock,​不具有事務交易處理)。 
 +  * InnoDB儲存引擎提供列鎖(行鎖)Rows Lock,​可以用於處理事務交易。 
 +======Lock Tables 特性與指令====== 
 +在做以下解說之前,​先在MySQL的test資料庫建立一個名為QQ的資料表並插入一些資料。(目前在 MySQL 5.1.71 下作業)<​code>​mysql>​ create table QQ(id int ,data char(10));</​code><​code>​mysql>​ insert into QQ(id,​data)values(1,'​AA'​),​(2,'​BB'​),​(3,'​CC'​),​(4,'​DD'​),​(5,'​EE'​),​(6,'​FF'​),​(7,'​GG'​),​(8,'​HH'​),​(9,'​II'​),​(10,'​JJ'​);</​code>​ 
 +==== Lock tables QQ read ==== 
 +  * 所有session(connection id)可以讀取QQ資料表,​但無法更新或寫入(包括建立此 lock tables的session)。 
 + 
 + 
 +^Time  ^session1 ​                                ​^session2 ​            ^ 
 +|      |mysql>​lock tables QQ read;               | | 
 +|      |mysql>​select * from QQ where id=1;  (OK)     ​|mysql>​select * from QQ where id=2; (OK)| 
 +|      |mysql>​delete from QQ where id=1; (ERROR 1099) |                                      | 
 +|      |                                              |mysql>​delete ​ from QQ where id=2; (在read Queue中 等待)| 
 +|      |mysql>​unlock tables ;​|mysql>​Query OK, 1 row affected (剛在等待的delete ​ from QQ where id=2被執行);​| 
 + 
 +==== Lock tables QQ write ==== 
 +  * 建立此 lock tables write 的session可以讀取並且也可寫入;​其他session不可寫入,​也不可讀取。 
 + 
 + 
 +^Time  ^session1 ​                                ​^session2 ​            ^ 
 +|      |mysql>​lock tables QQ write; ​              | | 
 +|      |mysql>​select * from QQ where id=1;  (OK)  | | 
 +|      |mysql>​delete from QQ where id=1;    (OK)      | | 
 +|      |                                          |mysql>​select * from QQ where id=10;​(在write Queue中 等待)| 
 +|      |mysql>​unlock tables; ​                     |mysql>​Query OK, 1 row affected (剛在等待的select * from QQ where id=10;​被執行);​| 
 + 
 +====Lock table read/​write優先權==== 
 +  * Lock tables write 比 Lock tables read 優先權高 
 + 
 +^Time  ^session1 ​                                ​^session2 ​            ​^session3^ 
 +|      |mysql>​lock tables QQ write; ​              ​| ​                   |        | 
 +|      |                                          |mysql>​lock tables QQ read;​(在write Queue中 等待) ​                   |        | 
 +|      |              |                    |mysql>​lock tables QQ write;​(在write Queue中 等待) ​        | 
 +|      |mysql>​unlock tables; ​              ​| ​                   |mysql>​Query OK, 0 rows affected (剛在等待的 lock tables QQ write;​被執行) ​      | 
 +|      |              |mysql>​Query OK, 0 rows affected (剛在等待的 lock tables QQ read;​被執行) ​                   |mysql>​unlock tables; ​       | 
 +|      |               ​|mysql>​unlock tables; ​                   |        | 
 + 
 + 
 +====Lock tables QQ LOW_PRIORITY write(此項指令在 MySQL 5.5.x以上式忽已經失效了)==== 
 +  * 降低write lock 優先權 使  read lock 優先權提高 
 + 
 +^Time  ^session1 ​                                ​^session2 ​            ​^session3^ 
 +|      |mysql>​lock tables QQ write; ​              ​| ​                   |        | 
 +|      |                                          |mysql>​lock tables QQ read;​(在write Queue中 等待) ​                   |        | 
 +|      |              |                    |mysql>​lock tables QQ LOW_PRIORITY write;​(在write Queue中 等待) ​        | 
 +|      |mysql>​unlock tables; ​              ​|mysql>​Query OK, 0 rows affected (剛在等待的 lock tables QQ read;​被執行) ​                   |       | 
 +|      |              |mysql>​unlock tables; ​                   |       ​mysql>​Query OK, 0 rows affected (剛在等待的 lock tables QQ LOW_PRIORITY write;​被執行) | 
 +|      |               ​| ​                  ​|mysql>​unlock tables; ​        | 
 + 
 + 
 ======參考資料====== ======參考資料======
   * [[http://​pcclass.cc.nthu.edu.tw/​nuke/​dbms.php?​filename=class2-2.html|鎖定資料表 (Lock)]]   * [[http://​pcclass.cc.nthu.edu.tw/​nuke/​dbms.php?​filename=class2-2.html|鎖定資料表 (Lock)]]
   * [[http://​xyz.cinc.biz/​2013/​04/​mysql-lock-tables.html|MySQL 鎖定資料表 (LOCK TABLES) ]]   * [[http://​xyz.cinc.biz/​2013/​04/​mysql-lock-tables.html|MySQL 鎖定資料表 (LOCK TABLES) ]]
database/mysql/locktable.1389428170.txt.gz · 上一次變更: 2014/01/11 08:16 (外部編輯)