我是靠谱客的博主 真实香菇,最近开发中收集的这篇文章主要介绍数据库基础:入门理解事务,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

问题:什么是事务?

  • 事务是数据库操作的最小工作单元,一个事务中的所有SQL语句作为一个整体一起向系统提交,要么都执行、要么都不执行。
  • 事务是主要是为了解决多个SQL语句操作时,带来的多个事务并发执行的问题。主要是为了原子性、一致性、隔离性。
  • 注意:单句SQL语句提交执行本身也是一次事务。

问题:什么ACID?

  • 原子性(Atomic):操作不可再分,事务的所有操作要么全部执行,要么全部失败 。
  • 一致性(Consistency):事务执行前后数据关系不被破坏。
  • 隔离性(Isolation):多个事务间执行隔离(支持并发),单个事务的执行不应该影响其他事务的执行。
  • 持久性(Durability):对数据库的修改,应永久存在,故障可恢复。但不存在100%的持久性

问题:多个事务并发会带来什么问题?

  • 脏读:事务之间没有隔离,操作数据时互相影响。(由于查询操作产生)
    • 例子:事务T1将某一值修改,然后事务T2读取该值,此后T1因为某种原因撤销对该值的修改,这就导致了T2所读取到的数据是无效的。
  • 不可重复读:两个事务互相隔离,但当两个事务同时操作,并且其中一个事务提交完成后,对数据进行了修改,对另一个事务是存在影响的。(由于修改操作而产生的)。
    • 例子:事务T1读取某一数据,事务T2读取并修改了该数据,T1为了对读取值进行检验而再次读取该数据,便得到了不同的结果。
  • 幻读:事务A读多条数据时,有可能因为事务B插入了新的数据,导致事务A在多次读取中数据数目不一致。(由于插入或删除操作而产生的)
    • 例子:事务T1读取某表的数据,事务T2读取并删除或添加了该表的数据,T1为了对读取值进行检验而再次读取该数据,便得到了不同的结果(删除或添加了数据)。

问题:事务隔离级别如何解决并发带来的问题?

事务隔离级别更新丢失脏读不可重复读幻读
未提交读避免发生发生发生
已提交读避免避免发生发生
可重复读避免避免避免发生
串行化避免避免避免避免
  • 未提交读:事务之间无隔离,所有的操作都会互相影响。
  • 提交读:一个事务只在完成数据提交后,才会对其他未完成的事务的数据产生影响。
  • 可重复读:事务完全隔离,每个事务内的数据独立,不受其他事务影响。(牺牲空间,数据冗余)
  • 串行化:一个事务执行完才能下一个事务执行(牺牲性能)

问题:InnoDB是如何在可重复读的事务隔离级别下解决幻读?

  • InnoDB默认情况下是采用“可重复读”级别的事务隔离等级
  • 在快照读情况下,mysql通过mvcc来避免幻读
  • 在当前读情况下,mysql通过next-key(行锁+间歇锁)来避免幻。

问题:什么是当前读、快照读?

  • 当前读:加了锁的增删改查语句
    • 查询:select … lock in share mode,select … for update
    • 数据修改:update, delete, insert
  • 不加锁的非阻塞读
    • 直接查询:select

问题:什么是MVCC(多版本并发控制)?

  • 版本号机制
    • 给每个事务一个序号作为版本号
    • 给每个行增加一个版本号
  • 每个事务中的行数据都是一个独立的版本号
    • 每个事务获取一行数据时,都会在使行数据在事务内版本号+1(提交前不影响实际版本号),然后事务每次读数据时,只能读到比事务内版本号低的数据版本。
    • 对于删除的数据,高版本的事务标记了一个deleted标记在数据中,不影响低版本的事务查看到数据。

问题:什么是间歇锁?

  • 间歇锁(Gap锁):实际上是对索引前后的间隙上锁,不对索引本身上锁。
    在这里插入图片描述
  • Gap锁会用在非唯一索引或者不走索引的当前读中。
  • 根据检索条件向左寻找最靠近检索条件的记录值A,作为左区间,向右寻找最靠近检索条件的记录值B作为右区间,即锁定的间隙为(A,B)。
  • Gap锁如何避免幻读?
    • 防止间隙内有新数据被插入
    • 防止已存在的数据,更新成间隙内的数据
  • 不适用情况:对主键索引或者唯一索引时不一定适用GAP锁
    • 如果where条件全部命中,则不会用GAP锁,只会加行锁
    • 如果where条件部分命中或者全不命中,则会加Gap锁

问题:什么是表级锁与行级锁?

  • 表级锁:锁对整张表都存在影响。
  • 行级锁:仅针对要处理的行数据存在影响。
  • 行与表中的读锁与写锁:
    • 读锁也称为共享锁。读锁上锁后,其他并发的线程也能进行读操作并上读锁。
    • 写锁也称为排它锁。上了锁后,就不能再上写锁或读锁,也就是不能进行写操作和读操作。

参考:

https://www.cnblogs.com/fanguangdexiaoyuer/p/10759746.html
https://www.cnblogs.com/jesssey/p/7771149.html
https://baijiahao.baidu.com/s?id=1629409989970483292&wfr=spider&for=pc

最后

以上就是真实香菇为你收集整理的数据库基础:入门理解事务的全部内容,希望文章能够帮你解决数据库基础:入门理解事务所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(80)

评论列表共有 0 条评论

立即
投稿
返回
顶部