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/