mysql锁

 

innodb没有数据库和页级别的锁

show engine innodb status

select 

r.trx_id waiting_trx_id,

r.trx_mysql_thread_id waiting_thread,

r.trx_query 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

隔离级别:

一个事务的修改对其他事务不可见 好似串行执行一样 不管这个事务有没有提交

innodb锁算法

record锁

gap锁

next-key锁

10,,11,13,14

delete from a where c<=13

通过查看 info bits 32  标记为删除

rc隔离级别下只有记录锁 没有gap锁

 

rr隔离级别下有记录锁和gap锁,因为rr解决了幻读

 

 

select * from c force index(primary)where c<=13

rr级别下锁住的是哪些 比13大的也要锁住

 20加了什么锁 可以修改吗

 

 

next-key lock优化为record锁

当索引含有唯一约束时

锁住的是一条记录

为什么可以降级呢 因为有唯一性 不可能有范围 

 

rc也有gap锁???

create table c(a int )

select * from c where a=10 for update;

这个锁怎么加,他会扫描自动创建的索引,rr级别他会多扫描一条记录

如果没有next-key锁

1  3  5

t1 

begin

del <=7   t2

              begin

              insert 6

               commit

commit

结果有6 日志里是先insert 6 再del <=7

传送到slave上回放 结果就没有6

真正隔离性并行执行像串行一样

 

为什么6没有被锁住呢???

 

 

 

我的疑问及理解:

疑问:为什么在测试隔离级别的时候,只关注我自己的隔离级别,其他的隔离级别不关注

而测试加锁的时候 我本身的隔离级别也必须要关注???

在测试隔离级别的时候,是测试一个事务读取另外一个事务修改数据自己是否可见及可见的程度,所以我只关注我这个事务的隔离级别,其他的事务隔离级别是什么样的,都没关系;但是我们测试锁的时候,是多个事务并发执行的时候,一种资源分需要配方式,每个事务操作的时候,都是通过锁的方式来对资源进行不同程度度的持有,锁只影响事务操作,而不影响事务看到数据的可见性。

一个是读数据,一个是操作数据

posted @ 2018-07-24 20:33  吕小果  阅读(116)  评论(0)    收藏  举报