欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

MySQL InnoDB锁机制详解_MySQL

程序员文章站 2022-06-16 20:18:38
...
bitsCN.com

MySQL InnoDB锁机制详解

为什么我们需要锁?先别急着回答、回想一下我们在逛淘宝下订单时的一个场景:

MySQL InnoDB锁机制详解_MySQL

InnoDB 是行锁、不存在锁升级问题、也就是、锁住 1 行和锁住 1 千万行的开销是一样

但是、InnoDB 行锁仍然存在一般的锁在高并发下所特有的"劣根性":

● 丢失更新:A的修改被B覆盖、谓之"前浪总被后浪盖"

● 脏读:不同事务间、读到未提交的数据

● 不可重复读:同一事务、两次读不同

外键无索引是Oracle 死锁发生的常见原因、而在InnoDB 、我赶脚、

InnoDB 是"买一送一"、并且、不要你也得要、因为、

在 InnoDB里、会自动对外键添加索引、人为删除外键索引会报错

有兴趣的朋友、对子表 show index from tbname; 便会发现

InnoDB 锁有 3种类型:

● Record Lock:锁定单条记录

● Gap Lock:锁定一个范围的记录、但不包括记录本身

● Next-Key Lock:锁定一个范围的记录、并且包含记录本身、这是默认的锁类型

那么、我们该如何显示加 InnoDB 锁呢?有 2种方式:

● select ... lock in share mode:加 S 锁

● select ... for update:加 X 锁

InnoDB 锁性能监控

[sql] view plaincopy

mysql> show status like 'innodb_row_lock_%';

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

| Variable_name | Value |

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

| Innodb_row_lock_current_waits | 0 |

| Innodb_row_lock_time | 23265 |

| Innodb_row_lock_time_avg | 2115 |

| Innodb_row_lock_time_max | 7401 |

| Innodb_row_lock_waits | 11 |

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

5 rows in set (0.00 sec)

解释如下:

Innodb_row_lock_current_waits:当前等待锁的数量

Innodb_row_lock_time:系统启动到现在、锁定的总时间长度

Innodb_row_lock_time_avg:每次平均锁定的时间

Innodb_row_lock_time_max:最长一次锁定时间

Innodb_row_lock_waits:系统启动到现在、总共锁定次数

影响 InnoDB 的几个参数

[sql] view plaincopy

mysql> select @@global.tx_isolation;

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

| @@global.tx_isolation |

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

| REPEATABLE-READ |

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

--设定事务隔离级别

mysql> select @@global.autocommit;

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

| @@global.autocommit |

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

| 1 |

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

--自动提交

mysql> select @@global.innodb_table_locks;

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

| @@global.innodb_table_locks |

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

| 1 |

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

--InnoDB 内部锁定一个表

mysql> select @@global.innodb_lock_wait_timeout;

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

| @@global.innodb_lock_wait_timeout |

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

| 50 |

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

--控制等待时间

mysql> select @@global.innodb_locks_unsafe_for_binlog;

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

| @@global.innodb_locks_unsafe_for_binlog |

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

| 0 |

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

--insert into ...select 是否锁定源表

bitsCN.com
相关标签: 淘宝