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没有被锁住呢???

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

浙公网安备 33010602011771号