您好,欢迎访问一九零五行业门户网

MySQL InnoDB锁机制详解_MySQL

bitscn.com
mysql innodb锁机制详解
为什么我们需要锁?先别急着回答、回想一下我们在逛淘宝下订单时的一个场景:
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
其它类似信息

推荐信息