/ NOTES

《SQL必知必会》读书笔记(一)

《 SQL 必知必会》读书笔记(一)

在程序开发中,多个线程并发访问某个数据时,就需要加,以确保数据的完整性一致性

数据库中加锁也是一样的,为了保证数据的一致性。且数据库中不同的隔离级别都是通过来实现的。

lock.drawio

锁可以分为乐观锁和悲观锁。

乐观锁

乐观锁(Optimistic Locking)是一种思想,认为对同一数据的并发操作不会总发生,属于小概率事件,不用每次都对数据上锁,也就是不采用数据库自身的锁机制,而是通过程序来实现

可以采用版本号机制或者时间戳机制实现。在更新提交时,将当前(版本号 / 时间戳)与更新之前的取得的(版本号 / 时间戳)进行比较,两者一致则更新成功,否则即为版本冲突。

适合操作多的场景。

悲观锁

悲观锁(Pessimistic Locking)也是一种思想,对数据被其他事务的修改持保守态度,会通过数据库自身的锁机制来实现,从而保证数据操作的排它性。

适合操作多的场景。

共享锁

共享锁锁定的资源可以被其他用户读取,但不能对其进行修改

排他锁

排他锁锁定的数据只允许进行锁定操作的事务使用,其他事务无法对已锁定的数据进行查询或修改。

意向锁

当上共享锁或排他锁时,数据库会自动给更大一级的空间加上意向锁。此时,其它事务就不能进行(全页 / 全表)的相应操作。

行锁、页锁、表锁

三者差别仅仅是锁定对象的粒度大小不同,分别按照行、页、数据表的粒度对数据进行锁定。

发生锁冲突的概率依次增大并发度与锁的开销依次减小

不同的数据库和存储引擎支持的锁粒度不同。