22. 数据库的隔离级别和锁机制

这篇具有很好参考价值的文章主要介绍了22. 数据库的隔离级别和锁机制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

数据库的隔离级别和锁机制

一、数据库隔离级别

1. 隔离级别说明

隔离级别是基于客户端来讨论的,不同的客户端在和服务器交互式可以有不同的隔离级别,客户端处在什么隔离级别就具有什么隔离级别的问题。mysql数据库的隔离级别一共有四种.

标志 名称 说明
read uncommitted 读未提交 不做任何隔离。可能产生脏读,不可重复读,虚读/幻读问题性能最好。
read committed 读已提交 一个事务可以读取到另一个事务已经提交的数据。可以防止脏读,但可能存在不可重复读,虚读/幻读问题,性能较好。
repeatable read 可重复读取 在查询整表数据时,一个事务可以读取到另一个事务已经提交的数据。可以防止脏读不可重复读问题,但可能存在虚读/幻读问题。mysql默认采用此隔离级别。性能一般。
serializable 序列化 通过锁进行严格隔离,对同一个数据的访问要串行化进行。可以防止脏读,不可重复读,虚读/幻读问题。但数据库处于串行化状态,效率极其低下。性能最差。

2. 如何选择隔离级别

1. 选择不同的隔离级别,就可以防止在并发读写的过程中的不同的隔离性问题,隔离级别设置的越严格,防止的问题就越多但性能就越低,隔离级别设置的越宽松,性能就越好但可能产生的隔离性问题就越多
2. 数据库使用者应该根据自己的需求选择一个合理的隔离级别,选择一个能够防止想要防止的问题的情况下性能尽量好的隔离级别。
3. 从可靠性角度:
    serializable > repeatable read -> read committed -> read uncommitted
4. 从性能角度:
    read uncommitted -> read committed -> repeatable read ->serializable
5. 在真正的开发中 脏读问题太严重,所以read uncommitted很少用。serializable性能太差,也很少用。所以只需根据是否需要防止不可重复读,在read committed 和repeatable read之间选择一个即可。在实际开发中 repeatable read用的跟多一些。

3. 查询当前客户端隔离级别的命令.

select @@tx isolation;

4. 修改隔离的命令

set[session/global] transaction isolation level 隔离级别名称;

1. 可以通过选择[session]来指定修改的是当前客户端的隔离级别,mysql服务器默认的隔离级别不变。
2. 可以通过选择[global来指定修改的是mysl服务器默认的隔离级别,当前客户端隔离级别不变,默认不写就是[global)

二、数据库中的锁

1. 共享锁、排他锁

数据库也是用锁来保证数据隔离的,但是为了数据库的锁设计的更加精细。体现在数据库中的锁分为共享锁和排他锁

1. 共享锁和共享锁可以共存,共享锁和排他锁不能共存
2. 排他锁和任何锁都不能共存
3. 在非serializable隔离级别下,查询不加锁
4. 在Serializable隔离级别下,查询加共享锁。
5. 任意隔离级别下增删改加排他锁。

正是利用了这种锁机制,数据库保证了并发的读不隔离,并发的写一定隔离,并发的读写在某一方或多方为Serializable的级别时,实现串行化,保证完全可靠。

2. 死锁

多个客户端都是serializable的级别下,先查询再修改,可能会进入与相等待状态,其实就是发生了死锁,mysql会检测到死锁,自动退出一方以打断死锁。

3. 行级锁、表级锁

数据库的锁根据锁定的粒度可以分为行级锁和表级锁。行级锁锁一行。表级锁锁整表。数据库自动根据操作的数据决定加哪种粒度的文章来源地址https://www.toymoban.com/news/detail-613358.html

三、解决更新丢失问题

1. 解决方案

1. 修改隔离级别为Serializablea。将数据库的隔离级别设置为Serializable即可完全防止更新丢失问题但通常基于效率的考虑,数据库的隔离级别不会设置为Serializable.此时要选择其他的解决方案
2. 悲观锁、乐观锁。在非Serializable隔离级别下,可以使用悲观锁、乐观锁来解决更新丢失。悲观锁、乐观锁并不是数据库中真正存在的锁,仅仅是更新丢失问题解决方案的名字。这个名字体现了在解决更新丢失问题时的思考的角度。

2. 乐观锁、悲观锁

1. 悲观锁悲观的认为每次查询都会造成更新丢失,则在查询时手动加上排他锁,从而在查询阶段就避免同时查询,从而避免更新丢失。在select语句后加上for update就可以手动增加排他锁。
2. 乐观锁乐观的认为每次查询都不会造成更新丢失,每次都正常执行查询,但为了防止可能的更新丢失造成危害,通常都会在表中额外设计一个额外版本字段,每次更新时版本字段都自增,且每次更新操作中必须基于上一个版本才做更新从而避免更新丢失造成的危害。

3. 乐观锁、悲观锁的选择

1. 悲观锁的缺点是一查就锁,查询多是效率低下
2. 乐观锁的缺点是,在大量的并发修改时,很容易造成修改失败,极端的情况下可能需要失败很多次才能完成修改,
3. 查询较多,修改较少,用乐观锁
4. 修改较多,查询较少,用悲观锁

到了这里,关于22. 数据库的隔离级别和锁机制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据库之事务隔离级别详解

    事务是一个原子操作,要么全部执行成功,要么全部执行失败。 事务的原子性确保一组逻辑操作,要么全部完成,要么完全不起作用。 执行事务前后,数据保持一致,例如转账业务中,无论事务是否成功,转账者和收款人的总额应该是不变的。 事务的隔离性是指在并发执行

    2024年02月07日
    浏览(73)
  • 【数据库的四种隔离级别】

    在关系型数据库中,隔离级别是指多个事务并发执行时,彼此之间的隔离程度。数据库的四种隔离级别如下: 最低级别的隔离级别,一个事务可以读取到另一个事务未提交的数据,可能会出现脏读、不可重复读和幻读等问题。 一个事务只能读取到另一个事务已经提交的数据

    2024年02月13日
    浏览(53)
  • 【数据库】事务的隔离级别以及实现原理

    经常提到数据库的事务,那你知道数据库还有事务隔离的说法吗,事务隔离还有隔离级别,那什么是事务隔离,隔离级别又是什么呢?本文就帮大家梳理一下。 事务,由一个有限的数据库操作序列构成,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。

    2023年04月26日
    浏览(42)
  • 数据库事务的四种隔离级别

    事务 数据库事务(简称:事务)是数据库管理系统执行过程中的一个逻辑单元,由一个有限的数据库操作序列构成。——维基百科 简而言之:一系列数据库操作语句组成事务。 数据库事务的隔离级别有四种: 读未提交(Read Uncommitted):事务中的修改可以被其他事务读取,

    2024年02月04日
    浏览(45)
  • 【Spring/MySQL数据库系列】数据库事务的特点与隔离级别

    ⭐️ 前面的话 ⭐️ 本文已经收录到《Spring框架全家桶系列》专栏,本文将介绍有关数据库事务的特点以及隔离级别。 📒博客主页:未见花闻的博客主页 🎉欢迎关注🔎点赞👍收藏⭐️留言📝 📌本文由 未见花闻 原创, CSDN 首发! 📆首发时间:🌴2023年5月20日🌴 ✉️坚

    2024年02月05日
    浏览(55)
  • 数据库事务的四大特性与事务的隔离级别

    概要: 事务的四个特性:原子性、一致性、隔离性、持久性 事务不隔离带来的问题:更新丢失、脏读、不可重复读、虚读(幻读)。其中更新丢失就是并发写,这是一定不允许的,因此一定要解决更新丢失问题。 事务隔离的级别:读未提交(1000)、读已提交(1100)、可重

    2023年04月09日
    浏览(52)
  • 【后端面经-数据库】MySQL的事务隔离级别简介

    目录 0. 事务的概念 1. 三类问题 2. 事务隔离级别 3. 操作指令 4. 总结 5. 参考博文 事务指的是一连串的集中操作指令,一个事务的执行必须执行完所有的动作才能算作执行结束。事务具有四个特点,简记作 ACID : A -Atomicity: 原子性,事务的执行必须保证所有的动作都执行完毕;

    2024年02月08日
    浏览(49)
  • 数据库隔离级别:从并发冲突到数据一致性的演进历程

    引言: ​ 数据库隔离级别是现代数据库系统中的重要概念,它决定了多个并发事务之间如何进行隔离,并确保数据的一致性。在数据库系统发展的早期,隔离级别的概念并不明确,开发人员需要自行处理并发冲突和数据不一致性的问题。然而,随着数据库系统的发展和应用需

    2024年02月04日
    浏览(46)
  • 聊一聊数据库事务的那些事(隔离级别,传播行为)

      我们平时使用事务的时候,可能脑子里面想到和事务有关的知识点无非就是,ACID,事务隔离级别那一套,使用的事务也就是是通过注解的形式,或者手动开启事务。更细致一点的问题或许没有深究下去,比如事务的传播行为,注解形式和手动事务的区别等,今天我们就这几

    2024年02月07日
    浏览(57)
  • elasticsearch的查询方式和mysql数据库事务隔离级别的思考

    目录 普通分页 解除查询限制 scroll查询 search_after 官方改进 轻量级试图(pit,Point in time) 总结 项目中用到了 elasticsearch,发现有几种查询方式不太一样,思考了一下,总结如下 等同于关系数据库的分页查询,例如 mysql 的 limit,如下 sql 这种查询方式有一个问题,需要查询

    2024年01月18日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包