数据库基础:入门理解事务

问题:什么是事务?

  • 事务是数据库操作的最小工作单元,一个事务中的所有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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

萌白在努力

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值