MYSQL 锁简介


MYSQL锁

1. MYSQL锁分为表级锁,行级锁,页面锁。

不同的存储引擎支持不同的锁机制。MYISAM和MEMORY使用的表锁。BDB采用的页锁。INNODB采用的是行锁。


2. INNODB支持行锁。分为共享锁,排他锁,意向共享锁,意向怕他锁。

共享锁可以使用语句select * from tab where ... lock in share mode;
排他锁可以使用语句select * from tab where ... for update;
意向锁是Innodb自动添加的。比如update,insert,delete语句,innodb会自动的增加意向排他锁。
select语句是不会产生锁。

innodb的行锁是通过索引来实现的。
innodb的行锁有三种类型:
Record Lock:对索引项加锁。
Gap Lock:对索引范围进行加锁,但是不包含边界值。
Next-Key Lock:锁定一个范围的记录、并且包含边界上值、这是默认的锁类型

gap lock在read commited下是不起作用的。只会被外键和主键检查时使用。
next-key lock在read commited下也是不存在的。


3. 锁相关的视图
innodb_trx 事务信息表。
INNODB_TRX由8个字段组成:

trx_id:唯一的事务ID
trx_state:事务的状态。 有running,lock wait,rolling back,committing。
trx_started:事务的开始时间。
trx_requested_lock_id:等待事务的锁ID。如trx_state的状态为LOCK WAIT,那么该值代表当前的等待之前事务占用锁资源的ID.
trx_wait_started:事务等待开始的时间。
trx_weight:事务的权重,反映了一个事务修改和锁住的行数。在InnoDB存储引擎中,当发生死锁需要回滚时,InnoDB存储会选择该值最小的进行回滚。
trx_mysql_thread_id:Mysql中的线程ID,SHOW PROCESSLIST显示的结果。
trx_query:事务运行的sql语句。

INNODB_LOCKS表,锁信息表。
lock_id:唯一锁的ID。包含事务id号。
lock_trx_id:事务ID。
lock_mode:锁的模式。S,X,IS,IX等等。
lock_type:锁的类型,表锁还是行锁。
lock_table:要加锁的表。
lock_index:锁的索引。
lock_space:InnoDB存储引擎表空间的ID号。
lock_page:被锁住的页的数量。
lock_rec:被锁住的行的数量。
lock_data:被锁住的行的主键值。

INNODB_LOCK_WAIT锁等待表。
requesting_trx_id:申请锁资源的事务ID。
requesting_lock_id:申请的锁的ID。
blocking_trx_id:阻塞的锁的ID。

可以通过下列语句查找阻塞的会话和语句。
SELECT r.trx_id waiting_trx_id, 
       r.trx_mysql_thread_id waiting_thread,
       r.trx_query waiting_query,
       b.trx_id blocking_trx_id,
       b.trx_mysql_thread_id blocking_thread,
       b.trx_query blocking_query
   FROM       information_schema.innodb_lock_waits w
   INNER JOIN information_schema.innodb_trx b  ON 
    b.trx_id = w.blocking_trx_id
  INNER JOIN information_schema.innodb_trx r  ON 
    r.trx_id = w.requesting_trx_id;

+----------------+----------------+--------------------------------------------------+-----------------+-----------------+----------------+
| waiting_trx_id | waiting_thread | waiting_query                                    | blocking_trx_id | blocking_thread | blocking_query |
+----------------+----------------+--------------------------------------------------+-----------------+-----------------+----------------+
| 1293972        |             72 | update emp set ename = 'Test' where empno = 7521 | 1293971         |              70 | NULL           |
+----------------+----------------+--------------------------------------------------+-----------------+-----------------+----------------+


4. 下面是通过具体的例子说明锁。
session 1:
start transaction;

update emp set ename = 'Test' where empno = 7521;

session 2:
start transaction;

update emp set ename = 'Test' where empno = 7521;

查找事务表innodb_trx。

mysql> select * from INNODB_TRX\G
*************************** 1. row ***************************
                    trx_id: 1293711
                 trx_state: LOCK WAIT         --在进行锁等待。
               trx_started: 2014-05-01 21:57:23
     trx_requested_lock_id: 1293711:21:3:3    --请求的锁id号。
          trx_wait_started: 2014-05-01 21:57:23
                trx_weight: 2
       trx_mysql_thread_id: 54                --线程号
                 trx_query: update emp set ename = 'Test' where empno = 7521
       trx_operation_state: starting index read
         trx_tables_in_use: 1
         trx_tables_locked: 1
          trx_lock_structs: 2
     trx_lock_memory_bytes: 360
           trx_rows_locked: 1
         trx_rows_modified: 0
   trx_concurrency_tickets: 0
       trx_isolation_level: READ COMMITTED
         trx_unique_checks: 1
    trx_foreign_key_checks: 1
trx_last_foreign_key_error: NULL
 trx_adaptive_hash_latched: 0
 trx_adaptive_hash_timeout: 10000
          trx_is_read_only: 0
trx_autocommit_non_locking: 0
*************************** 2. row ***************************
                    trx_id: 1293710
                 trx_state: RUNNING
               trx_started: 2014-05-01 21:57:21
     trx_requested_lock_id: NULL
          trx_wait_started: NULL
                trx_weight: 2
       trx_mysql_thread_id: 55
                 trx_query: NULL
       trx_operation_state: NULL
         trx_tables_in_use: 0
         trx_tables_locked: 0
          trx_lock_structs: 2
     trx_lock_memory_bytes: 360
           trx_rows_locked: 1
         trx_rows_modified: 0
   trx_concurrency_tickets: 0
       trx_isolation_level: READ COMMITTED
         trx_unique_checks: 1
    trx_foreign_key_checks: 1
trx_last_foreign_key_error: NULL
 trx_adaptive_hash_latched: 0
 trx_adaptive_hash_timeout: 10000
          trx_is_read_only: 0
trx_autocommit_non_locking: 0
2 rows in set (0.00 sec)

innodb锁信息表:

mysql> select * from INNODB_LOCKS\G
*************************** 1. row ***************************
    lock_id: 1293711:21:3:3
lock_trx_id: 1293711
  lock_mode: X             --排他锁
  lock_type: RECORD        --记录锁
 lock_table: `mydb`.`emp`
 lock_index: PRIMARY
 lock_space: 21            --表空间id
mysql> select space,name from INNODB_SYS_TABLESPACES where space=21;
+-------+----------+
| space | name     |
+-------+----------+
|    21 | mydb/emp |       --21指向表emp。
+-------+----------+
------------------>
  lock_page: 3             --页号
   lock_rec: 3             --行号
  lock_data: 7521          --锁的记录值
*************************** 2. row ***************************
    lock_id: 1293710:21:3:3
lock_trx_id: 1293710
  lock_mode: X
  lock_type: RECORD
 lock_table: `mydb`.`emp`
 lock_index: PRIMARY
 lock_space: 21
  lock_page: 3
   lock_rec: 3
  lock_data: 7521
2 rows in set (0.00 sec)

锁等待信息表:
mysql> select * from innodb_lock_waits\G
*************************** 1. row ***************************
requesting_trx_id: 1293711
requested_lock_id: 1293711:21:3:3
  blocking_trx_id: 1293710
 blocking_lock_id: 1293710:21:3:3
1 row in set (0.00 sec)

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25105315/viewspace-1153155/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/25105315/viewspace-1153155/

你可能感兴趣的:(MYSQL 锁简介)