💧 乐观锁与悲观锁 \color{#FF1493}{乐观锁与悲观锁} 乐观锁与悲观锁💧
🌷 仰望天空,妳我亦是行人.✨
🦄 个人主页——微风撞见云的博客🎐
🐳 《数据结构与算法》专栏的文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺
💧 《Java学习笔记》专栏的文章是本人在Java学习中总结的一些知识点~ 💐
🥣 《每天一点小知识》专栏的文章可以丰富你的知识库,滴水成河~ 🌊
🪁 希望本文能够给读者带来一定的帮助~🌸文章粗浅,敬请批评指正!🐥
文章目录
- 🌊一、乐观锁简介
- 🌊二、悲观锁简介
- 🌊三、乐观锁和悲观锁的优缺点
- 乐观锁的优点
- 乐观锁的缺点
- 悲观锁的优点
- 悲观锁的缺点
- 🌊四、适用场景
- 🐳结语
🌊一、乐观锁简介
💧乐观锁是一种并发控制策略
,它假设多个事务在执行期间不会发生冲突。当一个事务读取数据时,它会检查该数据的版本号是否与自己的版本号一致
。如果一致,则认为该数据未被其他事务修改过,可以安全地进行更新操作;否则,认为该数据已被其他事务修改过,需要重新获取最新版本号并重试更新操作。
🌊二、悲观锁简介
💧悲观锁也是一种并发控制策略
,它假设多个事务在执行期间会发生冲突。当一个事务读取数据时,它会先对该数据行加锁,防止其他事务修改该数据行
。当一个事务完成对数据的更新操作后,会释放锁资源,其他事务才能继续访问该数据行。
🌊三、乐观锁和悲观锁的优缺点
乐观锁的优点
- 不需要额外的存储空间来记录锁定信息。
- 可以减少死锁的可能性。
- 可以提高并发性能。
乐观锁的缺点
- 可能存在“脏读”问题。因为其他事务可能已经修改了数据,但是由于版本号不一致,当前事务仍然认为数据是未修改状态。
脏读(Dirty Read)是数据库中事务隔离级别的一种现象,它发生在一个事务读取了另一个事务未提交的数据。换句话说,当一个事务正在修改数据时,另一个事务可以读取到未提交的数据,这样可能导致读取到的数据是不一致或无效的。脏读可以导致数据的不一致性。
- 可能存在“不可重复读”问题。因为其他事务可能在当前事务读取数据之前就已经修改了数据,导致当前事务读取到的数据不是最新的。
不可重复读(Non-repeatable Read)也是数据库中事务隔离级别的一种现象,它发生在一个事务内多次读取同一数据,但每次读取得到的结果不一致。这种现象可以出现在以下情况:当一个事务读取了某个数据,然后另一个事务修改了该数据并提交,导致第一个事务再次读取时得到了不同的结果。这种情况下,事务无法重复读取相同的数据,因为数据已经发生了变化。
- 可能存在“幻读”问题。因为其他事务可能在当前事务读取数据之后插入了新的数据行,导致当前事务查询到的结果集发生变化。
幻读(Phantom Read)也是数据库中事务隔离级别的一种现象,它发生在一个事务内多次执行相同的查询,但每次查询得到的结果集不同。幻读通常发生在并发环境下,当一个事务在读取某个范围内的数据时,另一个事务在该范围内插入了新的数据并提交,导致第一个事务再次读取时发现新增了一些数据。这种情况下,事务感觉到发生了"幻觉",好像数据出现了新增的"幻影"。
悲观锁的优点
- 可以保证数据的一致性。
- 可以避免“脏读”、“不可重复读”和“幻读”等问题。
悲观锁的缺点
- 需要额外的存储空间来记录锁定信息。
- 可能降低并发性能。
- 如果多个事务同时访问同一数据行,可能会出现死锁问题。
🌊四、适用场景
乐观锁适用于读多写少的场景↓
💧因为在这种情况下,多个事务同时访问同一数据行的可能性较小,而且不需要保证数据的一致性。
悲观锁适用于读写都比较频繁的场景↓
💧因为在这种情况下,需要保证数据的一致性,而且需要避免死锁问题。
🐳结语
🐬初学一门技术时,总有些许的疑惑,别怕,它们是我们学习路上的点点繁星,帮助我们不断成长。
🐟积少成多,滴水成河。文章粗浅,希望对大家有帮助!