?
快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

澳門新莆京app官網:理解mysql鎖(2)表級鎖定

?

MyISAM 存儲引擎應用的鎖定機制完全是由 MySQL 供給的表級鎖定實現。

mysql的表級鎖定主要有兩種:寫鎖和讀鎖

對write寫鎖,MySQL應用的表鎖定措施道理如下:

* 假如在表上沒有鎖,在它上面放一個寫鎖。

* 否則,把鎖定哀求放在寫鎖定行列步隊中。

對read讀鎖,MySQL應用的表鎖定措施道理如下:

* 假如在表上沒有寫鎖定,把一個讀鎖定放在它上面。

* 否則,把鎖哀求放在讀鎖定行列步隊中。

當一個鎖定被開釋時,鎖定可被寫鎖定行列步隊中的線程獲得,然后是讀鎖定行列步隊中的線程。這意味著,假如你在一個表上有許多更新,SELECT語句將等待直到沒有更多的更新。

可以經由過程反省table_locks_waited和table_locks_immediate狀態變量來闡發系統上的表鎖定爭澳門新莆京app官網奪:

| Variable_name| Value |

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

| Table_locks_immediate | 18|

| Table_locks_waited| 0|

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

在 MySQL 中,主要經由過程四個行列步隊來掩護這兩種鎖定:兩個寄放當前正在鎖定中的讀和寫鎖定信息,別的兩個寄放等待中的讀寫鎖定信息,如下:

• Current read-lock queue (lock->read)

• Pending read-lock queue (lock->read_wait)

• Current write-lock queue (lock->write)

• Pending write-lock queue (lock->write_wait)

當客戶端哀求寫鎖時,mysql首先反省在Current write-lock queue是否已澳門新莆京app官網經有鎖定相同資本到信息存在,假如Current write-lock queue沒有,則再反省Pending write-lock queue ,假如在Pending write-lock queue 中找到了,則自己也必要進入該等待行列步隊;反之,假如在Pending write-lock queue 找不到,則再檢測Current read-lock queue,假如有鎖定存在,則同樣必要進入Pend澳門新莆京app官網ing write-lock queue。假如一開始就檢測到Current write-lock queue中有鎖定相同資本的寫鎖存在,那么就直接進入Pending write-lock queue。

讀哀乞降寫等待行列步隊中的寫鎖哀求的優先級規則主要為以下規則抉擇:

1. 除了 READ_HIGH_PRIORITY 的讀鎖定之外,Pending write-lock queue 中的 WRITE 寫鎖定能夠壅閉所有其他的讀鎖定;

2. READ_HIGH_PRIORITY 讀鎖定的哀求能夠壅閉所有 Pending write-lock queue 中的寫鎖定;

3. 除了 WRITE 寫鎖定之外,Pending write-lock queue 中的其他任何寫鎖定都比讀鎖定的優先級低。

表級鎖鄙人列幾種環境下比行級鎖更良好:

1. 很多操作都是讀表。

2. 在嚴格前提的索引上讀取和更新,當更新或者刪除可以用零丁的索引來讀取獲得時:

3. UPDATE tbl_name SET column=value WHERE unique_key_col=key_value;

4. DELETE FROM tbl_name WHERE unique_key_col=key_value;

5. SELECT 和 INSERT 語句并發的履行,然則只有很少的 UPDATE 和 DELETE 語句。

6. 很多的掃描表和對全表的 GROUP BY 操作,然則沒有任何寫表。

測試:

session A

顯示地給t1表加讀鎖定mysql> lock table t1 read;

Query OK, 0 rows affected (0.00 sec)自己的讀操作未被壅閉:

mysql> select * from t1;+------+

| i|+------+

|1 ||2 |

|5 |+------+

3 rows in set (0.00 se)session B

其他進程的讀操作也未被壅閉:mysql> select * from t1;

+------+| i|

+------+|1 |

|2 ||5 |

+------+3 rows in set (0.00 sec)

session Amysql> update t1 set i=3 limit 1;

ERROR 1099 (HY000): Table 't1' was locked with a READ lock and can't be updatedsession B

mysql> update t1 set i=3 limit 1;直接被壅閉了

session A解除讀鎖

mysql> unlock tables;Query OK, 0 rows affected (0.00 sec)

session B在session A開釋鎖定資本后,session B得到了資本,更新成功

mysql> update t1 set i=3 limit 1;Query OK, 1 row affected (0.00 sec)

Rows matched: 1Changed: 1Warnings: 0session A

獲取讀鎖的時刻增添local選項mysql> lock table t1 read local;

Query OK, 0 rows affected (0.00 sec)session B

其他session的insert 未被壅閉mysql> insert into t1 values(6);

Query OK, 1 row affected (0.00 sec)然而,其他session的update被壅閉了

mysql> update t1 set i=3 limit澳門新莆京app官網 1;直接被壅閉鳥

session A此次加寫鎖

mysql> unlock tables;Query OK, 0 rows affected (0.00 sec)

mysql> lock table t1 write;Query OK, 0 rows affected (0.00 sec)

自己的session可以繼承讀:mysql> select * from t1;

+------+| i|

+------+|3 |

|2 ||5 |

|6 |+------+

4 rows in set (0.00 sec)session B:

其他session的讀被壅閉了mysql> select * from t1;

直接被壅閉鳥session A

開釋鎖定資本mysql> unlock tables;

Query OK, 0 rows affected (0.00 sec)session B

其他session可以得到資本了mysql> select * from t1;

+------+| i|

+------+|3 |

|2 ||5 |

|6 |+------+

4 rows in set (0.00 sec)session A

經由過程DDL獲取write_allow_read類型的寫鎖定mysql> alter table t1 add constraint t1_pk primary key(i);

Query OK, 4 rows affected (0.07 sec)Records: 4Duplicates: 0Warnings: 0

session B其他session的讀未被壅閉

mysql> select * from t1;+---+

| i |+---+

| 2 || 3 |

| 5 || 6 澳門新莆京app官網|

+---+4 rows in set (0.00 sec)

免責聲明:以上內容源自網絡,版權歸原作者所有,如有侵犯您的原創版權請告知,我們將盡快刪除相關內容。

您可能還會對下面的文章感興趣:

快三平台开户