mysql innodb锁简析(1)

  说好的每天一个技术博客,选了iteye,但是,那个界面真的好丑啊,丑的让我都没写下去的欲望了,所以,还是转移到博客园里面吧,虽然这里也是很丑的!

  直接步入正题:

  1. 数据库锁包括:读锁(可共享锁)和写锁(排它锁),他们之间的关系如下

  读锁(S) 写锁(X)
读锁(S) +
写锁(X)

  说明:+表示兼容,—表示不兼容

  由上图可见:读锁与读锁之间是兼容的,但是其他就不兼容,也就是说如果加了写锁,那么就不能加其他的所。

  示例(摘抄同事的):

时间

Tx1:

Tx2:

T1

Set autocommit=0;

Set autocommit=0;

T2

select * from union_plan lock in share mode;

 

T3

 

update union_plan set notes='' ;

blocking

  2:查看锁的命令:SELECT * FROM information_schema.innodb_locks

  3: 锁按粒度分:表锁和行锁

  行锁:锁住的只是一行数据,对于其他数据没有影响。

  表锁:顾名思义,就是锁住的是一个表,自此,这个表便无法操作,常用DDL命令中。由于表锁涵盖了行锁,所以,表锁和行锁之间有冲突

  为了方便见此表锁和行锁之间的冲突便引入了意向锁,

  意向锁分为意向读锁(IS)和意向写锁(IX)

  意向锁是表级锁,但是去表示一个事务正在读或者写一条记录而不是整个表,所以意向锁之间不会产生冲突,真正的冲突在加行锁时检查

  在加行锁时,要先加一个意向锁。示例如下: 

  A. trx1 BEGIN
  B. trx1 
T1 X锁,修改表结构。
  C. trx2 BEGIN
  D. trx2
T1 IX(事务被阻塞,等待加锁成功)
  E. trx2
T1 一行记录SX.

 

  表锁的兼容性矩阵

     IS IX S  X
  IS 
+  +  +  – 
  IX 
+  +  -  -
  S  +  -  +  -
  X  -  -  -  -
  +
代表兼容, -代表不兼容


 
意向锁之间不会冲突, 因为意向锁仅仅代表要对某行记录进行操作。在加行锁时,会判断是否冲突。

结语:先写到这里吧,剩下的我再好好看看,写技术博客真的便于加强理解呢

 

 

 

你可能感兴趣的:(InnoDB)