关于数据库锁的一些总结

在总结数据库锁之前先阐述一下 数据库的集中隔离级别以及它们分别能避免哪些问题:

1.未提交读,最低级的隔离级别,不能避免丢失更新以及脏读。

2.提交读,可以避免丢失更新以及脏读。

3.可重复读,可以避免不可重复读。

4.可串行化,可以避免幻影读。

mysql默认级别是3,

mysql的两大主要引擎,1是innodb引擎,它支持表锁,行锁,支持事务,底层用的是聚簇索引,2。是myisam引擎,它仅仅支持表锁,不支持事务。

关于数据库锁的一些总结

 

innodb所有的锁是下面这些锁,其中乐观锁就是认为所有的事务都不会发生冲突,悲观锁就是所有的事务都可能发生冲突,所以乐观锁只在更新数据的时候查看版本号和时间戳,没有就提交事务,而悲观锁则是在进行更新,读写是之前就会自动进行加锁,再根据锁的兼容性有共享和排他锁   分别在mysql语句后面加上lock in share mode和for update,也可以提前声明:

关于锁的粒度则是表锁,行锁,页锁,表锁是对整个表枷锁,开销低,发生的冲突大,行锁则是相反,行锁在innodb中都是基于索引实现的,它锁定的也只是索引或者索引的区间而已。

关于快照读和当前读:

当前读就是加锁读,会读取最新记录的最新版本,保证读取器件其他的并发事务不会对当前读有所影响,一直到获取锁的事务释放为止。

快照读就是不加锁读,读取记录的快照版本而非最新版本,通过mvcc实现,保证事务中只有自己第一次读提交前的修改和自己的修改可见,其他都不可见。

关于MVCC ,在高性能mysql一书中的说明:

总结下来就是mvcc为

1.select选择版本号时只选择小于等于当前事务版本的数据行,可以确保事务读取的记录要么时事务开始之前已经存在,要么就是自己修改或者插入。

对于删除,要么未定义,要么大于当前版本号,可以确保事务即将读而未开始读的行不会在事务开始之前被事务删除。

2.insert  每一行保存当前系统版本号作为行版本号。

3.delete 为每一行保存当前版本号作为行删除标识。

4.update 保存当前版本号作为行版本号,同时保存当前版本号到原来的行作为行删除标识。

mvcc的好处就是不需要加锁,但是会有额外的开销,另外mvcc只与rr和rc兼容和 serializable 和ru不兼容,因为ru总是会读取最新的数据行,这与mvcc 的原理时矛盾的,serializable是会不停的加锁。

关于数据库锁的一些总结

 

下面是 innodb的 三种锁:record lock、gap lock和next-key lock

我会用详细的例子来解释这三种锁,

关于数据库锁的一些总结

 

 下面是不同的索引使用的区别:

关于数据库锁的一些总结

 

 1.等值查询使用聚簇索引

关于数据库锁的一些总结

 

record lock会对相关主键索引加锁。

 2.等值查询使用唯一索引

关于数据库锁的一些总结

会对辅助索引和主键索引加锁。

3.等值查询使用辅助索引:

关于数据库锁的一些总结

 

 

 会对辅助索引加一个gap锁,然后对主键索引加一个record 锁。

 

 ,先写这么多把,出去抽根烟再说。

 

关于数据库锁的一些总结

上一篇:sqli-labs第5-6关 详解


下一篇:Kubernetes 中给 Node 增加 Role: worker