​javascript:void(0)​


1. 锁是数据库区别于文件系统的重要特性之1,锁机制用于管理对共享文件的并发访问

   innodb使用的是行级锁

   myisam,使用的是表级锁,在并发条件下,读操作没有问题,但是并发插入会有性能上的影响

   sql server 2005之前的版本都是页级锁的,相对于myisam言,并发访问上性能有所提高,在2005以及之后,sql server 支持乐观并发和悲观并发,在乐观并发下执行行级锁,但实现方式和与innodb不相同,在sql server中,锁是一种稀有的资源,而在mysql innodb中,锁没有相关的开销,可以同时得到并发性和一致性

2. innodb的锁类型

    共享锁和排他锁

   共享锁 (S Lock): 允许事务读一行数据

   排他锁(X Lock):允许事务写或者修改一行数据

  ,可以在一行上使多个S锁,但是只要有X锁,就不能在加其他的锁了

  innodb存储引擎支持多粒度锁定,这种锁定允许在表级和行级上的锁同时存在,为了支持在不同粒度上架锁,innodb  提供了一种意向锁,意向锁是表级锁,且分为 意向共享锁和排他共享锁


+++++++++++++++++++++++++++++++++++++


​javascript:void(0)​

获取InnoDB行锁争用情况    

可以通过检查InnoDB_row_lock状态变量来分析系统上的行锁的争夺情况:

mysql> show status like 'innodb_row_lock%';

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

| Variable_name                 | Value |

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

| InnoDB_row_lock_current_waits | 0     |

| InnoDB_row_lock_time          | 0     |

| InnoDB_row_lock_time_avg      | 0     |

| InnoDB_row_lock_time_max      | 0     |

| InnoDB_row_lock_waits         | 0     |

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

5 rows in set (0.01 sec)

如果发现锁争用比较严重,如InnoDB_row_lock_waits和InnoDB_row_lock_time_avg的值比较高,还可以通过设置InnoDB Monitors来进一步观察发生锁冲突的表、数据行等,并分析锁争用的原因。

具体方法如下:

mysql> CREATE TABLE innodb_monitor(a INT) ENGINE=INNODB;

Query OK, 0 rows affected (0.14 sec)

然后就可以用下面的语句来进行查看:

mysql> Show innodb status/G;

*************************** 1. row ***************************

  Type: InnoDB

  Name:

Status:

------------

TRANSACTIONS

------------

Trx id counter 0 117472192

Purge done for trx's n:o < 0 117472190 undo n:o < 0 0

History list length 17

Total number of lock structs in row lock hash table 0

LIST OF TRANSACTIONS FOR EACH SESSION:

---TRANSACTION 0 117472185, not started, process no 11052, OS thread id 1158191456

MySQL thread id 200610, query id 291197 localhost root

---TRANSACTION 0 117472183, not started, process no 11052, OS thread id 1158723936

MySQL thread id 199285, query id 291199 localhost root

Show innodb status

监视器可以通过发出下列语句来停止查看:

mysql> DROP TABLE innodb_monitor;

Query OK, 0 rows affected (0.05 sec)

设 置监视器后,在SHOW INNODB STATUS的显示内容中,会有详细的当前锁等待的信息,包括表名、锁类型、锁定记录的情况等,便于进行进一步的分析和问题的确定。打开监视器以后,默认 情况下每15秒会向日志中记录监控的内容,如果长时间打开会导致.err文件变得非常的巨大,所以用户在确认问题原因之后,要记得删除监控表以关闭监视 器,或者通过使用“--console”选项来启动服务器以关闭写日志文件。


++++++++++++++++++++++++++++++++++




​​​​​​​​​​​​​​​​​​​​​​