说好的每天一个技术博客,选了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 的一行记录加S或X锁.
表锁的兼容性矩阵
IS IX S X
IS + +
+ –
IX + +
- -
S + - + -
X - - - -
+ 代表兼容,
-代表不兼容
意向锁之间不会冲突,
因为意向锁仅仅代表要对某行记录进行操作。在加行锁时,会判断是否冲突。
结语:先写到这里吧,剩下的我再好好看看,写技术博客真的便于加强理解呢