快捷搜索:  as  2018  FtCWSyGV  С˵  test  xxx  Ψһ  w3viyKQx

和记娱h188下载app手机版:理解mysql锁(2)表级锁定



MyISAM 存储引擎应用的锁定机制和记娱h188下载app手机版完全是由和记娱h188下载app手机版 MySQL 供给的表级锁定实现。

mysql的表级锁定主要有两种:写锁和读锁

对write写锁,MySQL应用的表锁定措施道理如下:

* 假如在表上没有锁,在它上面放一个写锁。

* 否则,把锁定哀求放在写锁定行列步队中。

对read读锁,MySQL应用的表锁定措施道理如下:

* 假如在表上没有写锁定,把一个读锁定放在它上面。

* 否则,把锁哀求放在读锁定行列步队中。

当一个锁定被开释时,锁定可被写锁定行列步队中的线程获得,然后和记娱h188下载app手机版是读锁定行列步队中的线程。这意味着,假如你在一个表上有许多更新,SELECT语句将等待直到没有更多的更新。

可以经由过程反省table_locks_waited和table_locks_immediate状态变量来阐发系统上的表锁定争夺:

| Variable_name| Value |

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

| Table_locks_immediate | 18|

| Table_locks_waited| 0|

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

在 MySQL 中,主要经由过程四个行列步队来掩护这两种锁定:两个寄放当前正在锁定中的读和写锁定信息,别的两个寄放等待中的读写锁定信息,如下:

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

•和记娱h188下载app手机版 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是否已经有锁定相同资本到信息存在,假如Current write-lock queue没有,则再反省Pending write-lock queue ,假如在Pending write-lock queue 中找到了,则自己也必要进入该等待行列步队;反之,假如在Pending write-lock queue 找不到,则再检测Current read-lock queue,假如有锁定存在,则同样必要进入Pending 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 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 和记娱h188下载app手机版|+------+

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 |

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

您可能还会对下面的文章感兴趣: